C语言:为什么scanf("%[^\n]",str);放在循环里时会反复输出第一次输入的字符串?

代码如下:

while (1) {
    scanf("%[^\n]", str);
    printf("%s\n", str);
}

非常普通的一个输入输出逻辑,使用scanf("%[^\n]",str);的含义是读入除回车符(\n)以外的所有字符。

这样做的好处是我们可以读入一行带空格的字符串,输入字符串完毕后回车即可赋值给str。

但当这个逻辑放入循环里之后,输入一行字符串,回车,就出现了神奇的事情:这个循环会一直输出这同一个字符串

原因是这样的:

%[^\n]的含义是“在找到换行符之前读取包含任何字符的字符串”。换行符本身不被使用,找到换行符后,它会继续留在输入流中。所以在下一轮循环会自动再从输入流中读取输入,并输出。

所以问题的关键就是丢弃掉这一输入流。

而%*c的含义是读取一个字符,并将输入流中的内容丢弃。

所以采用scanf("%[^\n]%*c", str);这种写法,即可实现将一行字符串读取,同时换行符会由%*c读取,然后整个字符串会存入str所在的内存中,然后输入流中的内容便会被丢弃,这样下次循环就可以重新输入了。

所以修改后如下:

while (1) {
    scanf("%[^\n]%*c", str);
    printf("%s\n", str);
}

最后是类似问题的解答:

https://stackoverflow.com/questions/31869628/why-ns-does-not-work-in-loop

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章