2016-08-22 66 views
1

我正在用C语言编写一个简单的数学函数阅读器,并使用gcc-5进行编译。 当我运行下面的代码fgets在字符串中生成随机字符

#include <stdio.h> 
#include <stdlib.h> 


int read_input(char* func) 
{ 
    printf("Please enter the function: "); 
    if (fgets(func, sizeof func, stdin)) { 
     printf("The function is %s.\n",func); 
    } 
    return 0; 
} 

int main() 
{ 
    char func[64]; 
    read_input(func); 
    for(int i = 0; i < sizeof(func); i++) { 
     printf("Char %d in func is %c\n", i, func[i]); 
    } 
    return 0; 
} 

我得到

Char 0 in func is h 
Char 1 in func is e 
Char 2 in func is l 
Char 3 in func is l 
Char 4 in func is o 
Char 5 in func is 

Char 6 in func is 
Char 7 in func is 
Char 8 in func is 
Char 9 in func is 
Char 10 in func is 
Char 11 in func is 
Char 12 in func is 
Char 13 in func is 
Char 14 in func is 
Char 15 in func is 
Char 16 in func is 
Char 17 in func is 
Char 18 in func is 
Char 19 in func is 
Char 20 in func is 
Char 21 in func is 
Char 22 in func is 
Char 23 in func is 
Char 24 in func is � 
Char 25 in func is 
Char 26 in func is @ 
Char 27 in func is 
Char 28 in func is 
Char 29 in func is 
Char 30 in func is 
Char 31 in func is 
Char 32 in func is 
Char 33 in func is 
Char 34 in func is 
Char 35 in func is 
Char 36 in func is 
Char 37 in func is 
Char 38 in func is 
Char 39 in func is 
Char 40 in func is 
Char 41 in func is 
Char 42 in func is 
Char 43 in func is 
Char 44 in func is 
Char 45 in func is 
Char 46 in func is 
Char 47 in func is 
Char 48 in func is � 
Char 49 in func is 
Char 50 in func is @ 
Char 51 in func is 
Char 52 in func is 
Char 53 in func is 
Char 54 in func is 
Char 55 in func is 
Char 56 in func is 
Char 57 in func is 
Char 58 in func is @ 
Char 59 in func is 
Char 60 in func is 
Char 61 in func is 
Char 62 in func is 
Char 63 in func is 

为什么我会得到一个新的行字符,以及如何我我不能在我与fgets怎么做呢?还有我得到的那些奇怪的角色是什么?

+1

的字符串是空终止因此只读到的strlen(FUNC)直到的sizeof(FUNC)。 – cup

回答

4
if (fgets(func, sizeof func, stdin)) 

问题是,当数组传递给函数时,数组会衰减为指向其第一个元素的指针。您正在传递一个char数组,然后该数组衰减为指向char的指针。因此,通过sizeof声明,您只需获取当前机器上指针的大小。对此的解决方案是将作为参数的元素数量传递给read_input,并将其用作fgets的第二个参数。或者,使用strlen

+3

这甚至不是阵列衰减的问题。在你调用的行的上下文中,'func'(可怕的名字,BTW)被声明为一个指针,而不是一个数组。当然'sizeof'只使用其操作数的*类型*,而不是它的值。 –

+0

所以当我做sizeof func时,我得到的指针大小显然是错误的?我将int func_size添加到read_input()的参数中,并从main中传递strlen func并更新了fgets输入,但我仍然得到了奇怪的字符和新行。 – thephysicsguy

+0

你可以在'read_input'函数中使用'strlen'。不需要额外的参数,因为你的情况下的数组是空终止的 – stackptr

1

问题出在sizeof func

这将是一个指针的大小。

正确使用将是strlen(func)

我和strlen的输出:

Please enter the function: hello 
The function is hello. 
Char 0 in func is h 
Char 1 in func is e 
Char 2 in func is l 
Char 3 in func is l 
Char 4 in func is o 
+1

你是在暗示'if(fgets(func,strlen(func),stdin))'? – chux

3

您使用sizeof确定数组的大小,并且它不会返回任何已输入的字符,改变您使用的代码打印字符这样的:

int size = strlen(func); 
for(int i = 0; i < size; i++) { 
    printf("Char %d in func is %c\n", i, func[i]); 
} 

而且你应该通过数组作为参数传递给函数的大小,读取输入即

void read_input(char* func, int size) 
{ 
    printf("Please enter the function: "); 
    if (fgets(func, size, stdin)) { 
     printf("The function is %s.\n",func); 
    } 
} 

正如你所看到的,我也改变了函数的返回类型,因为它是没用的,使函数返回一个int时,有没有这个必要。相反使用void

0

问题在于sizeof func在函数内部和main中是不同的。在功能方面,它是:

sizeof(char*)  // Will probably give 8 (or 4) 

在主要是:

sizerof(char[64]) // Will give 64 

所以你只允许8(或4)字符输入,但打印64

你需要做的:

1)添加大小作为函数的参数,并使用sizeof func调用函数时

2)将for循环更改为使用strlen(func)而不是sizeof func,因此您只打印出有效的字符。

要在func最终摆脱一个换行符的看到https://stackoverflow.com/a/28462221/4386427