c中的scanf和换行符

时间:2017-01-20 15:41:03

标签: c scanf stdio

我今天刚在C班上接受考试,我有理由相信答案可能不正确。

scanf("%d\n", &x); // Evaluate the expression for the string "54321\n"

这个想法很简单。查找整数并将扫描的数字放在与整数变量x对应的内存位置。但是,我不相信这次对scanf的调用会终止。

就我而言,所有对scanf到标准I / O的调用都会在按下回车键的情况下终止,因此不需要在说明符字符串中包含换行符。实际上,这种冗余只会导致程序停止搜索永远不会匹配字符串的内容。

有没有人可以澄清scanf功能的技术性来解决这个问题?

2 个答案:

答案 0 :(得分:2)

  

我不相信这次对scanf的调用会终止。

"54321\n"这样的6个字符输入不足以导致此scanf("%d\n", &x);返回。程序停滞不前。还有其他事情要发生。

'\n'指示scanf()消耗空格,直到

  1. 检测到非空白区域。

  2. stdin已关闭

  3. stdin上发生输入错误(罕见)。

  4. 由于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?