为什么stant :: string在用户输入中占用空格?

时间:2016-04-29 01:05:29

标签: c++ string tokenize spaces

直接解决问题:

此代码,

9 9

返回#include <iostream> using namespace std; int main() { std::string string; std::cin >> string; std::cout << string; return 0; } 作为输出。

然而,在向此代码输入9时,

{{1}}

输出{{1}}。为什么会这样?

我想这与空间有关,但是有什么方法可以避免这种情况吗?我必须说空格是数字之间唯一有效的分离。

5 个答案:

答案 0 :(得分:6)

std::cin一次只收一个字。要占用整行,您需要使用getline()函数。

使用方法: std::getline (std::cin,name);

您的情况:这应该适用于include <string>

#include <iostream>
#include <string>

int main() {
    std::string MyString;
    std::getline (std::cin, MyString);
    std::cout << MyString;
    return 0;
}

建议:你不再使用using namespace std;了。另外,使用适当的变量名称。

答案 1 :(得分:3)

输入操作符>> 的标准库重载std::istreamstd::string为参数设计从流中读取字符到std::string对象,直到找到分隔符,然后返回更改的流(用于进一步读取)。

默认情况下,所有空白字符都被识别为分隔符,在大多数实现中都是例如\t\n(空白的真正含义是由区域设置ctype facet)定义。

此设计的目的是将输入操作符用作输入数据的标记化器,例如

std::istringstream input_stream{"apple banana pear"};

std::string token;
while (input_stream >> token) {
    // Token per iteration is: "apple", "banana", and "pear".
}

此处input_stream >> token等同于调用std::operator>>(input_stream, token),它将读取字符直到分隔符为token,然后返回流对象input_stream。最终将返回的流对象作为bool子句中的while进行检查,该子句基本上返回!input_stream.fail()(请参阅std::basic_ios::operator bool)。

如果您需要的是在检测到换行符或文件结尾之前读取字符,请使用std::getline

如果您想从流中读取N个字符,请使用例如std::basic_istream::read

参考:

http://en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt

答案 2 :(得分:1)

std::cin是一个提取流对象,其提取行为取决于所使用的>>运算符重载。 (谢谢Ben)

对于C风格的字符串,std::string及其变体;它的运算符重载一次只提取一个“单词”(非分隔的字符序列)。

要获得整行字符,请使用std::getline

注意:默认分隔符取决于您的默认语言环境,对于en_us.utf8,它包括但不限于任何空格(" "),制表符("\t")和换行符( "\n"}遇到了

答案 3 :(得分:0)

  

为什么会这样?我想这与空间有关,但是   有什么办法可以避免这个吗?我必须说空间是唯一有效的   数字之间的分离。

输入操作符默认忽略空格(空白,制表符,换行符,换页符和回车符)!

您可以使用std::getline读取直到换行符(默认情况下):

std::getline(std::cin, string);

答案 4 :(得分:0)

使用名称空间std 编写后:不要像这样使用 std :: cin somrthing。