将句子作为用户的字符串输入读取
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();
我一直在尝试实现一个简单的代码,它将一个句子作为用户的输入,将其存储在一个字符串中并显示回来。
问题如下: 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();