我开始学习C++,遇到了一个奇怪的问题。我设法用这个重现了错误
while (true){ std::cout << last_inp << std::endl; sleep(1); last_inp = std::cin.get(); }
我希望这样做的是等待输入,将其打印出来并重复。它这样做,但在每个周期后,它打印两个额外的空行。我该怎么解决这个问题?
olmpazwi1#
试着输入一个长一点的单词,看得更清楚。hello-只要你没有按回车键,你就不会看到任何输出。然后你会看到你的循环运行了std::cin的buffer中的所有字符--然而在buffer本身中还有一个额外的换行符:就是你按回车键的结果std::cin.get()也获取了这个字符,并且没有任何区别,只是它引发了另一个换行符获取输出(您注意到的第一个),然后是来自std::endl的第二个字符,您将其添加到所有其他字符中。您可能会捕捉到新行字符的特殊情况,并简单地忽略它:
hello
std::cin
std::cin.get()
std::endl
if(last_inp != '\n') { sleep(1); last_inp = std::cin.get(); }
还要注意的是,在你实际读入一个字符之前输出 * 似乎有点问题-如果你在循环之前没有初始化last_inp,你甚至会得到 *undefined行为 *。您可能希望更改循环中的顺序:
last_inp
last_inp = std::cin.get(); std::cout << last_inp << std::endl;
无论是在睡觉前,睡觉后,还是睡觉之间,都可以根据你的喜好和要求来选择。
1条答案
按热度按时间olmpazwi1#
试着输入一个长一点的单词,看得更清楚。
hello
-只要你没有按回车键,你就不会看到任何输出。然后你会看到你的循环运行了std::cin
的buffer中的所有字符--然而在buffer本身中还有一个额外的换行符:就是你按回车键的结果std::cin.get()
也获取了这个字符,并且没有任何区别,只是它引发了另一个换行符获取输出(您注意到的第一个),然后是来自std::endl
的第二个字符,您将其添加到所有其他字符中。您可能会捕捉到新行字符的特殊情况,并简单地忽略它:
还要注意的是,在你实际读入一个字符之前输出 * 似乎有点问题-如果你在循环之前没有初始化
last_inp
,你甚至会得到 *undefined行为 *。您可能希望更改循环中的顺序:
无论是在睡觉前,睡觉后,还是睡觉之间,都可以根据你的喜好和要求来选择。