【发布时间】:2016-05-17 07:17:32
【问题描述】:
我见过一些例子,人们给 scanf 一个 "%[^\n]\n" 格式字符串来读取整行用户输入。如果我的理解是正确的,这将读取每个字符,直到到达换行符,然后换行符被 scanf 消耗(并且不包含在结果输入中)。
但我无法让它在我的机器上运行。我试过的一个简单例子:
#include <stdio.h>
int main(void)
{
char input[64];
printf("Enter some input: ");
scanf("%[^\n]\n", input);
printf("You entered %s\n", input);
}
当我运行此程序时,系统提示我输入,我输入了一些字符,然后按 Enter,光标移到下一行的开头,但 scanf 调用没有完成。
我可以按我喜欢的次数按 Enter 键,但它永远不会完成。
我发现结束 scanf 调用的唯一方法是:
- 在提示符处输入
\n作为第一个(也是唯一一个)字符 - 在提示符处输入 Ctrl-d 作为第一个(也是唯一一个)字符
- 输入一些输入,一个或多个
\n,零个或多个其他字符,然后按Ctrl-d
我不知道这是否与机器有关,但我很想知道发生了什么。我在 OS X 上,如果相关的话。
【问题讨论】:
-
不要发布文字图片!
-
它的 %[^\n],试试这个
-
@user3121023 谢谢,这正是我想使用 `"%[^\n]\n" 的原因。
-
将结尾的
\n放在调用scanf()的格式字符串中意味着消耗任何/所有结尾的空白。 (尾随空格会做同样的事情)。所以 scanf() 将不会退出,直到遇到尾随空格以外的其他内容。 -
关于这一行:
scanf("%[^\n]\n", input);这将允许用户继续输入字符,没有上限。这意味着用户可以溢出input[]数组。 input[64] 是输入缓冲区的定义,所以该行应该是:scanf("%63[^\n]\n", input);注意:比输入缓冲区的实际最大长度小一,因为 scanf 带有 '%s' 或 %[..] ' 格式转换说明符将始终将 NUL 字节附加到输入。