使用时(cin>>x)

Using while(cin>>x)

本文关键字:gt cin      更新时间:2023-10-16

可能的重复项:
C++ cin 空格问题

我在尝试理解这段代码时遇到问题。如果这个问题已经得到回答,我想道歉,但我在任何地方都没有找到它。我是初学者,这是一个非常基本的代码。问题是>>当第一个空格时运算符停止读取遇到字符,但为什么在这种情况下它会输出完整的输入字符串,即使我们的字符串中有空格。它在单独的行中输出字符串的每个单词。为什么 cin>>x 即使在空格之后也能接受输入?请帮助我完成此代码的功能。提前谢谢。

#include<iostream>
#include<string>
using std::cout;
using std::cin;
using std::string;
using std::endl;
int main()
{
string s;
while (cin >> s)
cout << s << endl;
return 0;
}

问题是>>当第一个空格时运算符停止读取 遇到字符,但为什么在这种情况下它会输出 完整的输入字符串,即使我们的字符串中有空格

因为你在循环中使用它。所以每次cin吃一个单词,你打印并丢弃空格。你在每个单词后面打印一个换行符的事实意味着你不希望看到空格 - 事实上s不包含任何空格。

测试这一点的一种简单方法是打印:

cout << s << "$";

然而,代码最有趣的特征是while如何测试<<返回的istream,在布尔上下文中,这些准确地产生你想要的:输入是否完成。

默认情况下,在流上使用输入运算符会在空格处停止,并跳过前导空格。因此,由于您在循环中阅读,因此它在读取您输入的所有"单词"时会跳过空格,然后在循环内用尾随换行符打印它。

您可能忽略了这样一个事实,即每当您输入新字符串(在空格字符之后,即换行符,制表符或空格之后),它都会在while循环条件下被重新分配给字符串s。要验证这一点,您只需执行以下操作:

int i=1;
while (cin >> s)
cout << i++ << ": " << s << endl;

而不是:

while (cin >> s)
cout << s << endl;

运行这个,一切都会非常清晰:)