我今天刚在C班上接受考试,我有理由相信答案可能不正确。
scanf("%d\n", &x); // Evaluate the expression for the string "54321\n"
这个想法很简单。查找整数并将扫描的数字放在与整数变量x
对应的内存位置。但是,我不相信这次对scanf
的调用会终止。
就我而言,所有对scanf
到标准I / O的调用都会在按下回车键的情况下终止,因此不需要在说明符字符串中包含换行符。实际上,这种冗余只会导致程序停止搜索永远不会匹配字符串的内容。
有没有人可以澄清scanf
功能的技术性来解决这个问题?
答案 0 :(得分:2)
我不相信这次对scanf的调用会终止。
像"54321\n"
这样的6个字符输入不足以导致此scanf("%d\n", &x);
返回。程序停滞不前。还有其他事情要发生。
'\n'
指示scanf()
消耗空格,直到
检测到非空白区域。
stdin
已关闭
stdin
上发生输入错误(罕见)。
由于stdin
通常是行缓冲,scanf()
会以块的形式接收数据。
第一个块 1 2 3 输入不足以导致scanf("%d\n", &x);
返回。上述3个中的一个需要发生。
任何以下输入,其中一些非空格符合#1,无论如何:
4 5 6 输入或
x y z 输入或
输入 输入 $ 输入或...
然后scanf()
将返回1,表示值123,存储在x
中。上面的 4 , x 或 $ 是检测到的导致完成的非空白区域。该字符将是stdin
上后续输入读取的下一个字符。
scanf("%d\n", &x);
几乎肯定是错误的代码,因为它要求另一个用户输入行,并且不检查其返回值。
答案 1 :(得分:1)
所有对scanf到标准I / O的调用都会在按下回车键的情况下终止,因此不需要在说明符字符串中包含换行符。
这是对的。格式字符串中的\n
将忽略任意数量的空格,包括“ENTER”键;所以,你必须输入一个非空白字符来终止scanf()
调用。所以,是的,\n
是有问题的。
scanf()
的手册页说:
·一系列空白字符(空格,制表符,换行符, 等等。;见isspace(3))。该指令匹配任意数量的 输入中的空格,包括无空格。
顺便说一句,scanf()
本身被认为有问题:Why does everyone say not to use scanf? What should I use instead?