c中的scanf和换行符

scanf and newlines in c

我今天刚刚在我的 C class 中进行了测试,我有理由相信答案可能不正确。

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

这个想法非常简单。求一个整数,将扫描到的数放在整数变量x对应的内存位置。但是,我不相信对 scanf 的调用会终止。

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

有没有人可以澄清 scanf 函数的技术细节来解决这个问题?

all calls to scanf to standard I/O terminate with the press of the enter key, so there is no need to include the newline in the specifier string.

没错。格式字符串中的 \n 忽略 任意数量的空格,包括 "ENTER" 键;因此,您必须输入 non-whitespace 字符才能终止 scanf() 调用。所以,是的,\n 是有问题的。

scanf() 的手册页说:

· A sequence of white-space characters (space, tab, newline, etc.; see isspace(3)). This directive matches any amount of white space, including none, in the input.

顺便说一句,scanf()本身被认为是有问题的:Why does everyone say not to use scanf? What should I use instead?

I don't believe that this call to scanf would ever terminate.

6 个字符输入如"54321\n" 不足以导致此scanf("%d\n", &x); 到return。程序停顿。还必须发生其他事情。


'\n' 指示 scanf() 消耗 white-spaces 并一直消耗到

    检测到
  1. a non-white-space。

  2. stdin已关闭

  3. stdin 出现输入错误(罕见)。

由于 stdin 通常是 缓冲,scanf() 以块的形式接收数据。

第一块123进入 不足以导致 scanf("%d\n", &x); 到 return。以上 3 项之一需要发生。

任何输入后的一些non-white-space满足#1,是:
456输入
xyz输入
输入输入$输入或...

然后scanf()将return用1表示一个值,123,被存储在x中。上面的 4x$ 是检测到的导致完成的 non-white-space。该字符将是 stdin.

上后续输入读取的下一个字符

scanf("%d\n", &x); 几乎可以肯定是错误的代码,因为它要求 另一行 用户输入并且不检查其 return 值。