当比较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!
这是为什么?
请尝试使用下面的代码行,因此scanf
会一直保留值,直到遇到'\n'
(换行符),因此空间也会被保存。
scanf("%[^\n]", name);
记住scanf
代表“扫描格式化”,并有珍贵的一点少比格式化用户输入的数据。如果您完全控制输入数据格式,但通常不适合用户输入,则这是理想选择。
我只想求佛以'%使用scanf'的' s'可能导致'name'的缓冲区溢出用户输入大量数据,因为'name'是堆栈中的一个变量。有关更多解释,请参见[这里](https://stackoverflow.com/a/2430310/8051589)。所以使用'fgets'应该是最好的选择。 –
我认为'fgets'和'scanf'返回不同的字符串(一个包含回车符,但我忘记了哪个) –
''''[\ n] s'无效。应该是'%[^ \ n]' –
对于''%s“'格式的'scanf'来说,读取*空格分隔的单词*是一件好事。 –
您是否尝试过在strncmp之前打印名称以检查在那里保存了什么? – CIsForCookies
这里没有理由使用'strncmp'。使用'strcmp',因此您不必在匹配中计数字符。并且*总是*检查'scanf'的返回值(并且就此而言,'fgets')。 – rici