【问题标题】:Understanding special type of access C++/C array [closed]了解特殊类型的访问 C++/C 数组 [关闭]
【发布时间】:2016-11-01 19:01:15
【问题描述】:

我有以下代码sn-p:

int ndigit[10] = {0,0,0,0,0,0,0,0,0,0};

void count() {
    char c;
    while (cin.get(c)) {
    if (c>='0' && c<='9') {
        ndigit[c-'0']++;
    }
}

所以c 必须在 0 和 9 之间(0 和 9),那么为什么需要像 ndigit[c-'0'] 那样索引数组而不是 ndigit[c] 呢?

如果我是对的,在这两种情况下,c 的值都可能出现不止一次,所以ndigit[c-'0'] 的值无论如何都会被覆盖...

我很欣赏你的智慧!

【问题讨论】:

标签: c++ c


【解决方案1】:

当您键入字符 0 作为该程序的输入时,您将获得一个十六进制值 x30 的字节(请参阅http://www.asciitable.com/

要访问数组的第一个元素,您需要 x00(二进制 0)。从输入的字符中减去 x30 将得到 0。

该逻辑有效,因为 0-9 的 ASCII 代码是 x30,x31,..x39。所以减去 0x30(或“0”相同的东西)会给你 0-9

【讨论】:

  • 假设 ASCII 编码或类似:不一定正确。请注意,C++ 和 C 标准都坚持编码具有 09 的顺序和单个块。
  • 当然可以是非 ascii 机器 - 但我的 10c 说它是
  • 我知道它适用于任何编码,但显示真实的可能值使其更清晰
  • 减去'0' 将适用于任何编码方案,因为数字必须是连续的。请不要使用幻数。
  • @WeatherVane 像您这样的高级堆栈用户应该让我们这些新手处理小而简单的问题,拜托:)
【解决方案2】:

“所以c 必须介于09 之间”

No! c 必须介于 '0''9' 之间,这会有所不同。

每个字符都有相应的数值(ASCII 码),例如。 g.:

  • 'A' 有 65 个
  • 'B' 有 66 个
  • 'a' 有 98 个

在 C 语言中,字符只是数字,例如。 G。 'A' + 'B' 是一个完全有效的表达式,表示65 + 66

如果我们想要显示或读取digit (0, 1, ..., 9),我们实际上使用它的符号表示,即。 e. character ('0', '1', ..., '9')。令人惊讶的是,这些字符没有 ASCII 值 0、1、...、9,而是 48、49、... 57 - 它们都是shifted by 48

所以对于转换数字symbol,例如。 G。 '7'(具有 ASCII 值 55 - 如 7 + 48)转换为我们人们在其中看到的 number(即 7 - 没有撇号),我们只需从它的ASCII 值:

    (7 + 48) - 48

这与从 '7' (=55) 中减去 '0' (= 48) 相同:

    '7' - '0'

而女巫正是这个表达方式

    c - '0'

在您的代码中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2013-04-23
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多