【问题标题】:C Array Count (Beginner) [duplicate]C数组计数(初学者)[重复]
【发布时间】:2013-07-22 08:50:45
【问题描述】:

我目前正在阅读 Kernighan & Richie 的“The C Programming Language”,我正在努力弄清楚一行的作用。我想我只是有点愚蠢,并不太理解他们的解释。

++ndigit[c-'0'];

我不得不稍微改变程序,因为ndigit 之前给了我垃圾值,所以我只是将数组实例化为 0,而不是使用 for 循环遍历它,并以这种方式更改值。

#include <stdio.h>

main()
{
    int c, i, nwhite, nother;
    int ndigit[10]= {0};

    nwhite = nother = 0;

    while ((c = getchar()) != EOF)
        if (c >= '0' && c <= '9')
            ++ndigit[c-'0'];
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nwhite;
        else
            ++nother;

    printf("digits =");
    for (i = 0; i < 10; i++) 
        printf (" %d", ndigit[i]);
    printf (", white space = %d, other = %d\n", nwhite, nother);
}  

使用程序作为输入,我们将其打印到控制台 -

digits = 7 2 0 0 0 0 0 0 0 1, white space = 104, other = 291

我知道7 2 0 0 0 0 0 0 0 1 是单个数字在输入中出现的次数的计数 0 出现 7 次,1 出现两次等)

但是,...[c-'0'];“工作”是如何工作的?

【问题讨论】:

    标签: c arrays kernighan-and-ritchie


    【解决方案1】:

    你问下面的表达式是如何工作的

     c-'0'
    

    输入字符的 ASCII 码从 0 的 ASCII 码中减去,它定义了数组中必须存储计数的位置。

    假设您从键盘输入 11 的 ASCII 码是 49,0 的 ASCII 码是 48。 因此

       49-48 =1 
    

    并且计数将存储在数组索引位置 1 中。

    【讨论】:

    • C 标准不要求使用 ASCII。 C 标准确实要求字符“0”到“9”具有连续值。
    • 注意:这仅适用于连续字符集(如 ASCII)
    【解决方案2】:

    在 C 中,当您有一个 char 类型的变量 c 时,它实际上存储了 char 的一些整数编码(通常是 ASCII 代码)。所以c-'0' 表示c 中包含的字符的代码与0 中的字符的代码不同。由于数字是自然顺序的,因此它会转换相关数字中的数字。

    【讨论】:

      【解决方案3】:

      c-'0' 是将 int 值 == 赋予字符数的技术,例如1'1'5'5'

      char 符号 '0', '1', '2' ..... '9' 被分配连续编码值,因此数字 char 常量与 '0' 的差异给出十进制数。 (在您的编译器中,例如在 ASCII char 中,它们被分配继续 acsii 值)。

      所以例如变量c'7',那么c - '0' == 7;

      在你的代码数组中声明为:

      int ndigit[10]= {0};   
                      // default initialized with `0`
      

      所以索引可以从09。所以在你的代码中:

      ++ndigit[c-'0'];  // ndigit[c-'0'] = ndigit[c-'0'] + 1;
      

      当在数字字符的相应数字处时,将数字的频率增加1

      【讨论】:

      • C 标准不要求使用 ASCII。 C 标准确实要求字符“0”到“9”具有连续值。
      • @EricPostpischil 再次感谢!好的是不是因为它可以使用其他编码?
      • 是的,我相信 IBM 仍然有使用 EBCDIC 编码的编译器,而嵌入式处理器的 C 实现可能会使用不寻常的字符集。或者,理论上,您可以修改 GCC 以使用 ASCII 以外的其他内容,并且仍然符合 C 标准。
      • @EricPostpischil 尝试写正确一点,以免误导..
      【解决方案4】:

      Ascii 是一种将连续 id 赋予连续数字的编码。正如 Eric Postpischil 指出的那样,标准要求该属性,即使底层编码不必是 ascii。不过 Ascii 很常见。

      char c1 = '0';
      char c2 = '1';
      

      所以无论'0' 映射到什么数字,'1' 都将是那个数字 + 1。本质上:

      c2 == c1 + 1
      

      从一个数字字符中减去'0',将返回其数值:

      '1' - '0' == 1
      

      【讨论】:

      • C 标准不要求使用 ASCII。 C 标准确实要求字符“0”到“9”具有连续值。
      【解决方案5】:

      C 标准要求字符“0”到“9”具有连续值。

      '0' 将值零表示为一个字符,c 是您输入的值,它计算如下:

      '1' - '0' == 1

      '2' - '0' == 2

      等等...即等于c的值如果c是一个数字

      【讨论】:

        【解决方案6】:
        ((c = getchar()) != EOF)
                if (c >= '0' && c <= '9')
                    ++ndigit[c-'0'];
        

        c 为您提供当前角色。通过范围检查,您确认它是一个数字by using its ASCII value 检查chr 列中的0,它显示488 它显示56。所以,'8'- '0' 给出56 - 48 = 8

        ndigit 用于跟踪数字出现的次数,数组的每个元素表示其下标出现的次数。 ndigit[0] 会告诉你0 出现的次数等等。ndigit[x] 会告诉你x 出现的次数

        [c - '0']
        

        假设你的c 即当前字符是8 然后'8' - '0' 会给你8。所以你得到ndigit[8] 和你++ 那个值[你在开始时将它初始化为0]

        【讨论】:

        • C 标准不要求使用 ASCII。 C 标准确实要求字符“0”到“9”具有连续值。
        【解决方案7】:

        查看 ASCII wikipedia

        美国信息交换标准代码 (ASCII /ˈæski/ ass-kee)1 是一种字符编码方案,最初基于英文字母表,对 128 个指定字符进行编码 - 数字 0-9、字母 az 和AZ、一些基本的标点符号、一些源自电传打字机的控制代码和一个空格 - 变成 7 位二进制整数。

        所以在 ASCII 方案中,字符“0”是数字 48,字符“1”是 41,依此类推。所以 c - '0' 等价于 c - 48。如果 c 是 '1',则表达式变为 49 - 48 = 1。所以在几个单词中 'c' - '0' 转换一个数字字符 ['0'-'9 '] 转换成整数 [0-9]。

        编辑 1 正如@Eric Postpischil 所建议的,ASCII 不是 ANSI C(也不是 c++)的一部分。但是很常见,我知道的所有编译器都使用 ASCII 集。

        【讨论】:

        • C 标准不要求使用 ASCII。 C 标准确实要求字符“0”到“9”具有连续值。
        【解决方案8】:

        '0' 是一个字符,它的值为 48。您可以在 google 中查找任何 ASCII 表。 它是这样工作的,因为您从输入 char 值而不是 int 中读取,所以如果您不添加“-'0'”部分,它将增加数组的第 48 个单元格。 你可以用“-48”代替“-'0'”,我认为这样更易读。

        【讨论】:

        • C 标准不要求使用 ASCII。 C 标准确实要求字符“0”到“9”具有连续值。
        猜你喜欢
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 2019-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多