【发布时间】:2017-01-21 18:43:12
【问题描述】:
当我不使用任何扫描集或否定扫描集时,遇到缓冲区中的哪个字符会使scanf()停止从缓冲区读取数据(假设字符数组足够大)?似乎答案是空白,因为如果我们在输出中输入一个多词句子,那么默认情况下scanf() 只存储第一个词,但是当我运行此代码时:
int main(void) {
char n[20];
int status;
do {
status = scanf("%[^ ]", n);
//status = scanf("%s", n);
printf("%d %s\n", status, n);
} while (status);
return 0;
}
输入hello world,按回车键,输出为:
1 hello
0 hello
当我将do-while 更改为:
do {
//status = scanf("%[^ ]", n);
status = scanf("%s", n);
printf("%d %s\n", status, n);
} while (status);
我得到这个作为输出(对于相同的输入):
1 hello
1 world
程序无法自行终止
再次,对于第一个do-while,如果我输入hello 并按回车,我没有得到任何输出并且程序不会终止(显然是因为它没有读取空格)。但是第二个do-while就不是这样了。
如果有人能回答我如何更改我的代码以使其在按下返回键时终止,那将是很棒的,同时一次存储一个单词。
【问题讨论】:
-
正如手册页告诉你的那样,它通常会忽略前导空格并在下一个空格处停止(作为第二个示例)。第一个示例专门指示
scanf将空格视为终止符:因此它保留在输入缓冲区中。 -
通常建议不要使用
scanf,它会很麻烦。使用fgets,然后使用sscanf更易于管理。 -
非常好的问题。 +1