3

我正在尝试编写一个控制台程序,它从输入中获取一个数字并将其放入一个数组中。只要用户没有点击“空格”按钮,读入就会持续。我已经尝试了几件事,但我的程序不会将输入与“空格”的 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;
}
4

5 回答 5

4

您的代码有几个问题。最基本的是每次通过循环执行两个输入,第一个在 中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。

于 2013-03-18T09:44:08.500 回答
0

空格的 acii 代码是 32。所以你应该替换 64 或 13,即回车到 32:

while((char)cin.get() != 32)

但是问题可能是 cin 可能会在某些字符上停止,例如空格:您可以通过设置禁用此行为: cin.unsetf(ios::skipws); 根据C ++,用户输入检查'\ 0'在空格处停止吗?

于 2013-03-18T09:29:33.537 回答
0

这是答案:

int fabcd[25],number_of_items = 0;
cout << "The read in loop lasts while you don't hit space:\n";
char a;
while((a=cin.get()) != ' ')
{

        fabcd[number_of_items]=a;
        number_of_items++;      
}   
return 0;
于 2013-03-18T09:49:19.897 回答
0

尝试这个 :

 #include <iostream>
#include <conio.h >
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( _kbhit() != 32  )
    {
            char ch =getche();
            if (ch != 32 )
            {
           cin >> fabcd[number_of_items];
            number_of_items++;
            }
            else
                break;

    }   
    cout << "\nnumber of items:"<<number_of_items;
    cin.get();
    cin.get();
    return 0;
}
于 2013-03-18T09:52:15.610 回答
0

(char)13 是回车而不是空格。

不是你会做的事情:

((char)cin.Get()) !=' '
于 2013-03-18T09:24:51.250 回答