【问题标题】:How is this array recording occurrences of each digit of input?这个数组如何记录每个输入数字的出现?
【发布时间】:2014-06-18 10:04:33
【问题描述】:

我正在使用 K&R 书学习 C,并且遇到了一个显示数组使用的程序。该程序使用一个数组来记录输入的每个数字(数字)的出现,而不是存储单个数字(或者我认为)。除此之外,该程序还计算空格和其他字符。这是程序 -

#include <stdio.h>

int main(int argc, const char * argv[])
{

    // insert code here...
   // printf("Hello, World!\n");

    int c,i,nwhite,nother;
    int ndigit[10];

    nwhite=nother=0;
    for(i=0;i<10;i++)
        ndigit[i]=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("\n white space= %d, other=%d\n", nwhite,nother);

    return 0;
}

这是一个示例输出-

my birthday was 08081980
hello
digits = 3100000031
 white space= 5, other=18

我花了一段时间才弄清楚ndigit 数组记录了每个数字出现的次数。示例-0 在我的输入中出现 3 次。

但是,我无法弄清楚数组是如何通过循环设置的。一开始,

for(i=0;i<10;i++)
        ndigit[i]=0;

这个 for 循环将 ndigit 数组的每个元素设置为零。但是后来,我不明白这个 if 语句会发生什么-

if (c>='0' && c<='9') {
            ++ndigit[c-'0'];
        }

这可能是因为我以前没有遇到过这种类型的代码。 ++ndigit[c-'0'] 表达式试图做什么?这是否假设输入的每个数字都是字符的形式,然后通过其 ASCII 值在内部转换为 int? c -'0' 表达式在这里做什么?

非常感谢您在这方面的帮助。

【问题讨论】:

    标签: c arrays ascii


    【解决方案1】:

    c-'0' 给出与c 中的字符对应的数值。它通过从c 中的值中减去'0' 字符的值来实现这一点。这是因为在大多数字符方案中,数字被赋予连续的数字代码(例如,在 ASCII 中,数字 0,1,2,3,4,5,6,7,8,9 被赋予数字代码值 48,49,50,51,52,53,54,55,56,57)。

    ndigit[n] 获得nth 的ndigit 值。由于n在本例中为c-'0',因此它给出了ndigit的元素对应于c所代表的数值。

    ++expr 增加(即增加 1)expr 引用的值。在这种情况下,expr 是数组中与c 的数值对应的元素。

    【讨论】:

      【解决方案2】:

      您需要记住,字符常量在 C 中被视为 int 类型的值。特别是,它们是整数值。

      在任何情况下,标准都保证典型字符(如英文字母或数字)具有所有正整数值,值范围为char
      此外,对于任何字符编码模式,保证(由标准 C)数字“0”到“9”具有连续的代码。例如,在 ASCII 的典型情况下,我们会:

        '0' == 48  
        '1' == 49
        ...
        '9' == 57  
      

      现在,if (c&gt;='0' &amp;&amp; c&lt;='9') 的句子是“询问”c 的值是否在数字范围内。
      然后,表达式c - '0' 为您提供数字的整数值,因为它很容易检查。
      例如,如果c == '3',我们将有 '3' - '0' == 51 - 48 == 3。

      这很重要,因为任何数组的索引都是从 0 开始的,并且在程序中,数组ndigit 旨在保存数组第 j 个位置的第 j 个数字的信息。
      因此,表达式ndigit[ '3' - '0' ]ndigit[3] 相同。

      最后,要进行“计数”,我们需要将存储在ndigit[3]中的值加1,因此进行了递增操作,这是通过++运算符实现的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-27
        • 2011-05-02
        • 1970-01-01
        • 1970-01-01
        • 2014-09-29
        相关资源
        最近更新 更多