您的代码有几个问题。最基本的是每次通过循环执行两个输入,第一个在 中while
,第二个>>
在循环中使用。另请注意,第二个将跳过任何空格,然后将输入转换为整数。如果输入不能合法地转换为整数(例如下一个字符是'a'
),则输入进入错误状态,并且cin.get()
总是返回EOF
。当然,如果您正在输入数字,您可以轻松输入超过25
,并超出缓冲区。
如果您只想输入一个数字序列,那么:
std::vector<int> fabcd;
int tmp;
while ( std::cin >> tmp ) {
fabcd.push_back( tmp );
}
是你所需要的全部。(数字必须用空格分隔。)如果你想输入数字,直到你遇到一个空格,像下面这样的东西应该可以工作:
std::vector<int> digits;
int tmp = std::cin.get();
while ( tmp != EOF && ! std::isspace( tmp ) ) {
digits.push_back( tmp /* or tmp - '0' */ );
tmp = std::cin.get();
}
请注意, 的结果std::cin.get()
被分配给 a
int
,而不是a char
。此函数int
有意返回一个,因为它必须能够返回带外值EOF
。这有几个变体:如果您使用
std::cin::peek()
, 而不是std::cin::get()
,您实际上不会提取字符(您必须在循环中执行此操作);并且还有std::get( char& )
,它将字符提取到给定char
中,前提是它不在 EOF 处。使用此函数,循环将是:
std::vector<int> digits;
char tmp;
while ( std::get( tmp ) && ! std::isspace( tmp ) ) {
digits.push_back( tmp );
}
(您可能还想使用std::isdigit
, 而不是!
std::ispace
控制循环。)
编辑:
最后一点:空格或其他任何内容的实际数字代码取决于实现,不一定是32。此外,您需要类似地处理制表符和换行符。您应该始终使用isspace
等功能。或者,如果您确实想检查一个空格,并且只检查一个空格,请与 比较' '
,而不是 32。