这是我的C代码:
int main()
{
int a;
for (int i = 0; i < 3; i++)
scanf("%d ", &a);
return 0;
}
当我输入像
1 2 3
这样的内容时,它会要求我继续输入,我需要输入一些不是空格的内容。然而,当我将其更改为(或其他不是
' '
的内容)scanf("%d !", &a);
如果输入 1 ! 2! 3!
,程序将不会要求更多的输入。
这是我的C代码:
int main()
{
int a;
for (int i = 0; i < 3; i++)
scanf("%d ", &a);
return 0;
}
1 2 3
这样的内容时,它会要求我继续输入,我需要输入一些不是空格的内容。' '
的内容)scanf("%d !", &a);
如果输入 1 ! 2! 3!
,程序将不会要求更多的输入。
scanf("%d ", &a);
中,最后的空格指示scanf
消耗数字后的所有空白字符。它将从stdin
持续读取,直到您输入非空白字符。简化格式如下:scanf("%d", &a);
scanf
仍会忽略数字前的空格。
相反,格式"%d !"
会消耗数字后的任何空格和单个!
。它在获取此字符或另一个非空格字符时停止扫描,并将其留在输入流中。从返回值无法确定它是否匹配了!
。
scanf
非常笨拙,很难正确使用。最好用fgets()
读取一行输入,然后用sscanf()
或更简单的函数如strtol()
、strspn()
或strcspn()
解析该行输入。
scanf("%d", &a);
这应该可以完成工作。
scanf()
函数会根据其模式匹配尽可能多的 stdin
输入。如果你传递 "%d"
作为模式,它将在找到一个整数后停止读取输入。然而,如果你传递例如 "%dx"
的模式,它将匹配所有跟着字符 'x'
的整数。
更多细节:
你的模式字符串可以包含以下字符:
空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行和制表符--请参见 isspace)。格式字符串中的单个空格验证从流中提取的任何数量的空白字符(包括没有)。
非空白字符,除了格式说明符(%):任何不是空白字符(空格、换行或制表符)或格式说明符的字符(以 % 字符开头)都会导致函数读取流中的下一个字符,将其与此非空白字符进行比较,如果匹配,则丢弃它,并继续处理格式的下一个字符。如果字符不匹配,则函数失败,返回并留下流的后续字符未读取。
格式说明符:由初始百分号(%)组成的序列表示格式说明符,用于指定要从流中检索并存储到附加参数指向的位置的数据类型和格式。
"%dx"
实际上会接受输入行1 2 3
,因为尽管它未能匹配每个输入数字的“尾部上下文”(即x
),但它确实匹配了数字并报告成功。试试看! - Jonathan Leffler