当比较C中的字符串时,fgets比scanf更有效吗?

问题描述:

以下代码时:发生当比较C中的字符串时,fgets比scanf更有效吗?

#define MAX_NAME_LENGHT 256 
int main(void) 
{ 
    char name[MAX_NAME_LENGHT]; 
    printf("Enter your name: \n"); 
    scanf("%s", name); 
    if(strncmp(name, "John Smith", 10) == 0) 
    { 
     printf("Hello, John Smith!\n"); 
    } 
    else 
    { 
     printf("Intruder!!!\n"); 
    } 
    return 0; 
} 

许多错误,尽管输入查询John Smith输出打印Intruder!!!。然而,当我更换

scanf("%s", name); 

fgets(name, sizeof(name), stdin); 

输出打印Hello, John Smith!这是为什么?

+4

对于''%s“'格式的'scanf'来说,读取*空格分隔的单词*是一件好事。 –

+1

您是否尝试过在strncmp之前打印名称以检查在那里保存了什么? – CIsForCookies

+1

这里没有理由使用'strncmp'。使用'strcmp',因此您不必在匹配中计数字符。并且*总是*检查'scanf'的返回值(并且就此而言,'fgets')。 – rici

请尝试使用下面的代码行,因此scanf会一直保留值,直到遇到'\n'(换行符),因此空间也会被保存。

scanf("%[^\n]", name); 

记住scanf代表“扫描格式化”,并有珍贵的一点少比格式化用户输入的数据。如果您完全控制输入数据格式,但通常不适合用户输入,则这是理想选择。

+1

我只想求佛以'%使用scanf'的' s'可能导致'name'的缓冲区溢出用户输入大量数据,因为'name'是堆栈中的一个变量。有关更多解释,请参见[这里](https://stackoverflow.com/a/2430310/8051589)。所以使用'fgets'应该是最好的选择。 –

+0

我认为'fgets'和'scanf'返回不同的字符串(一个包含回车符,但我忘记了哪个) –

+0

''''[\ n] s'无效。应该是'%[^ \ n]' –