【问题标题】:C: unable to understand the following array assignmentC:无法理解下面的数组赋值
【发布时间】:2009-08-17 22:40:04
【问题描述】:

问题说明了一切:

...
int ndigit[10];
...//fill in the array with 0s

while((c = getchar()) != EOF)
    if(c >= '0' && c <= '9')
         ++ndigit[c - '0']; //<== unable to understand this part

据说,该数组存储来自输入流的传入数字字符...

【问题讨论】:

  • 就像所有提到 ASCII 的回复的旁注一样。 ISO C 不保证字符集是 ASCII;但是,据我记得,它确实保证,无论数字字符 '0' ... '9' 有什么整数值,它们都是连续的 - 所以如果 c 是一个 char 这是一个数字, (c - '0') 是一种可移植的方式来检索该数字的值。
  • 即使 EBCDIC 的字母被分成三个跨度,也将数字保持在连续的代码点。 CDC 显示代码和 DEC Rad-50 也是如此。显然,Baudot 几乎没有留下任何东西,如果纸带向后安装,他更喜欢有某种意义的编码。由于 Unicode 采用 ASCII 作为前 128 个码位,因此它也保持数字连续。

标签: c arrays


【解决方案1】:

在 C 中,您可以使用字符代码对字符进行算术运算。所以这确保你有一个数字,找出它是哪个数字(通过测量它与零的差异),然后在数组中的相应位置增加一个计数。完成后,ndigit[0] 将包含 '0' 的出现次数,ndigit[1] 将包含 '1' 的出现次数,依此类推。

【讨论】:

    【解决方案2】:

    它正在创建字符 0-9 的直方图。 "c- '0'" 将 getchar() 中的值转换为整数,用作数组的索引。该索引对应于数字 0-9。然后它递增该数组位置。因此,一旦它完成运行,数组就会包含字符 0-9 的重复。

    所以 0123456789 应该导致所有的数组。 0123333 应该会产生一个值为 1114000000 的数组。

    【讨论】:

      【解决方案3】:

      字符 0 与数字 0 不同。

      在 ASCII 中,字符“0”位于位置 48。该标准保证在字符编码中,数字必须是连续的(我不知道标准中的哪个地方这么说)。也就是说,就像 1 在 0 之后一样,'1' 将在 '0' 之后。因此,如果您输入了“0”,并且想要得到 0,请从中减去“0”。 '1' 减去 '0' 会相差 1。以此类推。

      【讨论】:

        【解决方案4】:

        POSIX 和 ISO C 都需要:

        与 数字 0 到 9 应使 0后每个字符的值应 比值大一 前一个字符。

        【讨论】:

          【解决方案5】:

          getchar() 将字符的字符代码作为 int 返回。查看 ASCII 图表,例如:http://www.cs.utk.edu/~pham/ascii_table.jpg

          所以如果你输入 '0' c 将是 48。从输入值中减去 '0' 就像减去 48,所以你最终会在整数数组中得到 int 值 0..9

          【讨论】:

            【解决方案6】:

            c - '0' 将字符从其 ASCII 代码转换为值本身。这成为数组索引。数组下标运算符的优先级高于预增量,因此数组中结果索引处的值将递增。

            【讨论】:

              【解决方案7】:

              [c - '0'] 部分正在为 ndigit[] 创建一个从零开始的索引。它通过取 c(它的 ASCII 值在 48 到 57 范围内)并减去 48(ASCII 值为 '0')来做到这一点

              【讨论】:

                【解决方案8】:

                这里使用 ASCII 值减法 这意味着 '0' => ASCII 值是 48 并且 '1' => ASCII 值是 49。

                printf("%d",'0');  // 48 value
                printf("%d",'1');  // 49 value 
                ....
                printf("%d",'9');  // 57 value 
                

                然后减去这个值。

                当 c 为 1 时

                [c - '0'] =1;

                [49-48] = 1;

                【讨论】:

                  【解决方案9】:

                  这是输入符号从“0”到“9”的增量计数器。

                  例如

                  如果你在 ndigit[1] 为 2 时输入 '1' 两次, 如果你在 ndigit[5] 为 1 时输入“5”一次,
                  如果你在 ndigit[0] 将 5000000 =) 时输入 '0' 5000000 次 =)

                  ...等等

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-05-06
                    • 1970-01-01
                    • 2014-11-19
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-03-01
                    相关资源
                    最近更新 更多