直接解决问题:
此代码,
9 9
返回#include <iostream>
using namespace std;
int main() {
std::string string;
std::cin >> string;
std::cout << string;
return 0;
}
作为输出。
然而,在向此代码输入9
时,
{{1}}
输出{{1}}。为什么会这样?
我想这与空间有关,但是有什么方法可以避免这种情况吗?我必须说空格是数字之间唯一有效的分离。
答案 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::istream
和std::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。