将句子读作用户的字符串输入

时间:2015-06-04 08:40:34

标签: c++ string flush

我一直在尝试实现一个简单的代码,该代码将句子作为用户的输入,将其存储在字符串中并将其显示回来。

以下是问题: 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;
}

3 个答案:

答案 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();