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

Reading sentences as string inputs from users

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

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

这是一种奇怪的方式。因此,您要求用户告诉程序,在任何其他输入之前,将跟随多少行?为什么不简单地:

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, '.');

如何终止变成T的输入?用换行符。在你读入 T 之后换行会发生什么?它仍然留在输入缓冲区中。下次调用 std::getline 时会发生什么,它将读取的第一个字符是什么?换行符,接下来会发生什么?循环迭代然后 T 为零(对于第一种情况 T 最初是 1)和循环然后程序退出。

此问题的解决方案是 ignore 个字符,包括换行符。

在cin后面加一个getchar,作为T输入后的\n在buffer中。

std::cin >> T;
getchar();