我通过这两个例子问我的问题,在第一个程序中,当我输入我的名字时,它可以正常工作:
#include <stdio.h>
int main ()
{
char str [20];
while(1)
{
printf ("Enter your name: ");
scanf ("%19s",str);
printf ("Your name is %s\n",str);
}
return 0;
}
输出:
Enter your name: Reza
Your name is Reza
Enter your name:
但是在以下程序中,结果不符合预期:
#include <stdio.h>
int main ()
{
char str [20];
while(1)
{
printf ("Enter your name: ");
scanf ("name=%19s",str);
printf ("Your name is %s\n",str);
}
return 0;
}
当输入name = Reza作为输入时,程序反复打印输出:
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
Enter your name: Your name is Reza
...
您认为这是怎么回事?预先感谢
通过简单参考man scanf
进行解释。在您的第一种情况下:
scanf ("%19s",str);
%s
转换说明符忽略前导空格,因此静默消耗了输入缓冲区('\n'
)中剩余的stdin
。
第二种情况:
scanf ("name=%19s",str);
您格式字符串正在寻找文字"name="
作为输入的一部分,由于先前的输入之后剩余的'\n'
没有被使用,因此发生了[[匹配失败,因为您的输入实际上是"\nname=..."
,此时字符提取停止,从而使输入缓冲区中的字符未被读取-导致每个后续输入都发生相同的故障。
格式字符串
的开头包含一个空格,从而导致任何前导空格都被使用:scanf (" name=%19s",str);
现在您可以输入,例如:
name=Gary name=Tom ...