只要用户没有按下“空格”按钮,读入就会持续。提前感谢!
#include <iostream>
using namespace std;
int main()
{
int fabcd[25],number_of_items = 0;
cout << "The read in loop lasts while you don't hit space:\n";
while((char)cin.get() != 32)
{
cin >> fabcd[number_of_items];
number_of_items++;
}
return 0;
}
发布于 2013-03-18 09:44:09
你的代码有几个问题。最基本的是每次通过循环进行两次输入,第一次在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()
的结果被分配给int
,而不是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。
发布于 2013-03-18 09:24:51
(char)13表示回车符,而不是空格。
不是你要做的重点:
((char)cin.Get()) !=' '
发布于 2013-03-18 09:29:34
表示空格的acii代码是32。因此您应该替换64或13,这是carraiage为32:
while((char)cin.get() != 32)
然而,问题可能是cin可能会在某些字符上停止,例如空格:根据C++, user input check for '\0' stops at spaces?,您可以通过设置: cin.unsetf(ios::skipws);来禁用此行为
https://stackoverflow.com/questions/15473265
复制相似问题