【问题标题】:Integer getch() -'0'整数 getch() -'0'
【发布时间】:2014-11-30 04:58:49
【问题描述】:

我创建了一个数独游戏,您将在其中输入行号,然后输入列号。我设置了一个 if else 条件,即只输入数字 1-9。我在输入数字后使用了 getch 函数而不是 cin 以避免使用 enter 按钮。

但是当我在行中输入 1 时,它不会接受它并打印数字 49。我对此进行了研究,了解到 getch 函数用于获取字符,如果输入 1,它将转换为 ' 1' 相当于整数 49。我找到了一个解决方案,方法是使用 getch() -'0' 而不是只使用 getch();

它可以工作,但我似乎无法理解有关它如何工作的解释。有人可以解释一下 getch() -'0' 的工作原理吗?

这里是我使用 getch() -'0' 的地方:

cout << "Enter row: "; row = getch() -'0';
if(row > 9 || row < 1) {
                cout << "Rows 1 to 9 only!" << endl;
                Sleep(1000);
                system("cls");
                loop -= 1;
} else {
                cout << row << "\nEnter column: "; column = getch() -'0';
                if(column > 9 || column < 1) {
                    cout << "Columns 1 to 9 only!" << endl;
                    Sleep(1000);
                    system("cls");
                    loop -= 1;
}

【问题讨论】:

    标签: c++


    【解决方案1】:

    getch() 将获取 char 的值并将其转换为它的 int 值。这就是你得到 49 的原因。

    现在,如果 chars 具有 int 值并且 1 是 49,想象一下从中减去 0 的 int 值。数字的顺序是从 0-9,所以如果一个有 49,那么零有 48。所以你是说,得到这个 int 值(1 = 49)并减去 0 的 int 值(48),49-48 = 1 .

    这适用于所有代表数字的字符。例如:8 - '0' == 56 - 48 = 8。

    【讨论】:

      【解决方案2】:

      这个技巧依赖于这样一个事实,即数字 0-9 的编码在字符序列中是按顺序排列的,在 ASCII 中它们是值 48-57。因此,如果输入字符“4”,它将返回 52,您可以通过 52 - 48 = 4 将其转换为数字。当然危险是有人会输入非数字 - 您需要仔细检查错误。

      【讨论】:

        【解决方案3】:

        和你写的一样

        int k=getch()       //stores ascii value of the entered character
        

        由于字符'0'的ascii值为48,所以如果你用48减去k,你将得到相应的输入数字

        类似的事情发生在这里---

        getch()-'0'

        【讨论】:

          【解决方案4】:

          getch() 返回按键的 ascii 码。

          数字 0..9 的 ascii 代码是连续的,0 = 48、1 = 49、2 = 50,依此类推。

          C/C++ 编译器将单引号字符转换为其 ascii 代码,因此 '0' 编译为 48。

          getch() - '0' 是从键入的数字中减去数字范围的 ascii 代码偏移量,得到按下的数字从 0 开始的偏移量。0 位于偏移量 0,1 位于偏移量 1,2 位于偏移量 2,依此类推。

          【讨论】:

            【解决方案5】:

            请注意,您减去的不是 0,而是“0”。这是一个很大的区别,因为 '0' 是一个字符,所以当你减去它时,你会隐式地将它转换为一个 int 值,即 ASCII 中的 48。因此,您基本上是在读取 ASCII 表中字符的“索引”值,然后减去您关心的第一个字符的索引以获得相对“索引”。您的 if 语句应该处理任何无效字符,包括字母和符号,这样应该可以正常工作。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-06-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-06-01
              • 2011-05-13
              相关资源
              最近更新 更多