[英]Extract part of an input string by scanf()
我通过这两个例子问我的问题,在第一个程序中,当我输入我的名字时,它可以正常工作:
#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;
}
Output:
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作为输入时,程序重复打印 output:
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
转换说明符忽略前导空格,因此输入缓冲区 ( stdin
) 中留下的'\n'
被静默消耗。
在你的第二种情况下:
scanf ("name=%19s",str);
您格式化字符串正在寻找文字"name="
作为输入的一部分,因为没有消耗您先前输入后留下的'\n'
,所以会发生匹配失败,因为您的输入实际上是"\nname=..."
,此时字符提取停止,输入缓冲区中的字符未读 - 导致每个后续输入都出现相同的失败。
您可以解决问题,包括格式字符串开头的空格导致任何前导空格被消耗:
scanf (" name=%19s",str);
现在您可以输入,例如:
name=Gary
name=Tom
...
(当然,如果用户输入的任何名称超过 19 个字符,或者猫不小心踩到键盘,您仍然会遇到无关字符问题)
您还必须检查使用的每个输入 function 的返回- 特别是scanf
。 只需检查是否发生了预期的转换次数,例如
if (scanf (" name=%19s",str) != 1) {
fputs ("error: conversion failed.\n", stderr);
/* handle error */
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.