我正在尝试编写一个控制台程序,它从输入中获取一个数字并将其放入一个数组中。只要用户没有点击“空格”按钮,读入就会持续。我已经尝试了几种方法,但我的程序不会将输入与“空格”的 ASCII 码进行比较。提前致谢!
#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;
}
最佳答案
您的代码有几个问题。最根本的
是你每次通过循环做两个输入,第一个
在 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。
关于c++ - 如何比较输入与 ASCII 码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15473265/