我一直在尝试实现一个简单的代码,该代码将句子作为用户的输入,将其存储在字符串中并将其显示回来。
以下是问题: 1.当T = 1时,程序立即退出。 2.当T> 1时,循环仅运行T-1次。
我认为使用cin来存储T的值是一个问题。由于cin的某些缓冲容量,输入的T值是否存储为字符串?
#include <iostream>
#include <string>
int main()
{
int T;
std::cin >> T;
while (T--)
{
std::string song;
getline(std::cin, song);
std::cout << song << std::endl;
}
return 0;
}
答案 0 :(得分:1)
这是一种奇怪的方式。因此,在任何其他输入之前,您要求用户告诉程序,将跟随多少行?为什么不简单:
std::string s;
while (getline(std::cin, s)) {
std::cout << s << std::endl;
}
(这将简单地回显每一行(按回车键结束该行),直到文件结束(Ctrl-d
)。
无论哪种方式,您的代码问题都是while (T--)
:那么为什么不尝试查看T
是什么,以及getline
在每次迭代时给出的内容? (我会让你自己解决)。为什么不使用惯用语:
for (int i = 0; i < T; ++i)
P.S。如果您想阅读句子而不是行,您可能需要考虑阅读分隔符(例如.
)。 getline
也将为您做到这一点:
getline(std::cin, s, '.');
答案 1 :(得分:1)
如何终止变为u
的输入?换行。阅读T
后,换行符会怎样?它仍然留在输入缓冲区中。下次致电T
时会发生什么,它会读到的第一个字符是什么?换行,接下来会发生什么?循环迭代,然后std::getline
为零(对于T
最初为T
的第一种情况)和循环,然后程序退出。
此问题的解决方案是ignore个字符,包括换行符。
答案 2 :(得分:1)
在输入T保留在缓冲区后,在cin之后添加一个getchar作为\ n。
std::cin >> T;
getchar();