【问题标题】:How to compare input with ASCII code?如何比较输入与 ASCII 码?
【发布时间】:2023-03-16 14:19:01
【问题描述】:

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

【问题讨论】:

  • 它会得到一个整数输入,并与数字 32 进行比较
  • 也许 cin.get() 不会以这种方式或其他方式工作
  • 不,它把它当作一个字符,但仍然无法工作 xD
  • 流默认为空格跳过行为。参见例如stackoverflow.com/questions/6774825/…
  • 等等!这是什么? cin &gt;&gt; fabcd[number_of_items]

标签: c++ while-loop compare ascii


【解决方案1】:

您的代码存在几个问题。最根本的 是你每次通过循环做两个输入,第一个 在while 中,第二个在循环中使用&gt;&gt;。也请注意 第二个将跳过任何空格,然后将输入转换为 一个整数。如果输入不能合法地转换为 整数(例如,下一个字符是'a'),输入为 进入错误状态,cin.get() 将始终返回EOF。 当然,如果您正在输入数字,您可以轻松地 输入超过25,并溢出缓冲区。

如果你只想输入一个数字序列,那么:

std::vector<int> fabcd;
int tmp;
while ( std::cin >> tmp ) {
    fabcd.push_back( tmp );
}

就是你所需要的。 (数字必须用白色隔开 空格。)如果你想输入 digits,直到你 遇到一个空白,应该像下面这样 工作:

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&amp; ),它提取 字符到给定的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。

【讨论】:

  • 感谢您的深入回答。我会研究它:)
【解决方案2】:

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

这不是你会做的:

((char)cin.Get()) !=' '

【讨论】:

    【解决方案3】:

    空格的acii码是32,所以你应该用64或13代替,也就是回车到32:

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

    但是问题可能是 cin 可能会在某些字符上停止,例如空格:您可以通过设置禁用此行为: cin.unsetf(ios::skipws); 根据C++, user input check for '\0' stops at spaces?

    【讨论】:

    • 问题是我尝试了 32,然后想尝试使用输入按钮 13,但由于某种原因我的循环仍然不会停止。
    • cin >> 纯文本从输入中读取直到第一个空白字符,但不包括第一个空白字符。也许 std::getline(cin, plainText) 可以工作。
    • std::ios::skipwsstd::istream::get 没有影响。只有格式化输入 ('>>') 会跳过空格。
    【解决方案4】:

    试试这个:

     #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;
    }
    

    【讨论】:

    • 用什么语言?那不是 C++,在少数支持 &lt;conio.h&gt; 的平台上,它已被弃用。它是 MS-DOS 的保留(它是 CP/M 的保留),您永远不应该在新代码中使用 &lt;conio.h&gt;
    【解决方案5】:

    答案如下:

    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;
    

    【讨论】:

    • 这是不正确的,将在文件末尾进入无限循环。 std::cin::get() 返回 int 是有原因的,在测试文件结尾之前将其分配给 char总是不正确的。
    • @JamesKanze,是的,它是 int,但可以分配给 char
    • 重要信息丢失。在正确的代码中,您不能在确保它不是EOF(通常为-1,但保证为负数)之前将其分配给char
    • @JamesKanze,你怎么能指望这里有EOF?好吧,但你是对的,如果需要,你确实需要在将其转换为 char 之前检查 EOF
    • 与您在任何地方获取文件结尾的方式相同。你怎么能确定不会有文件结尾?
    猜你喜欢
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多