代码如下:
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