在C中增加数组元素

时间:2017-06-09 19:17:31

标签: c

我是C的新手,我现在正试图通过Kernighan和Ritchie的书。我对他们用来引入数组的代码有疑问。

#include <stdio.h>
int main()
{
    int c, i, nwhite, nother;
    int ndigit[10];

    nwhite = nother = 0;
    for (i = 0; i < 10; ++i) /* What does this 'for' loop do? */

    {
        ndigit[i] = 0; 
    }
    while ((c = getchar()) != EOF)
        if (c >= '0' && c <= '9') /* Why are the numbers in quotes? */
        {
            ++ndigit[c - '0']; /* What does the "- '0'" part do? */

        }
        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);
}

4 个答案:

答案 0 :(得分:1)

  1. 这个'for'循环有什么作用?将数组ndigit的所有元素设置为0。
  2. 为什么数字在引号中?因为它们不是数字,而是字符。
  3. “ - '0'”部分有什么作用?这会将数字字符转换为数字。这是因为字符以ASCII标准排序 - '0'char的值为48,'1'为49等...

答案 1 :(得分:1)

我会尝试为您评论此代码。 请记住,ndigit是一个整数数组,初始化一个整数数组意味着通常将其所有值设置为零。

#include <stdio.h>
int main()
{
    int c, i, nwhite, nother;
    int ndigit[10];

    nwhite = nother = 0;
    for (i = 0; i < 10; ++i) /* This loop initializes the ndigit array */

    {
        ndigit[i] = 0; 
    }
    while ((c = getchar()) != EOF)
        if (c >= '0' && c <= '9') /* c is a char, not an int */
        {
         ++ndigit[c - '0']; /*a difference between two chars numeric values*/

        }
        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);
}

答案 2 :(得分:1)

来自您在代码评论中的问题:

/* What does this 'for' loop do? */

这个for循环从0迭代到9,为ndigit中的每个元素赋值0。

/* Why are the numbers in quotes? */

函数getchar()从stdin中获取一个字符,即用户输入。 Text是ASCII值的集合,可以使用单引号'a'通过单个字符引用。 尽管getchar()实际上返回char值(1个字节),但实际返回值为int,因此错误时会返回-1

因此,正在检查存储在char中的int值,以确保它在ASCII字符&#39; 0&#39;之间。和&#39; 9&#39;。 &#39; 0&#39;的ASCII值是48作为数值。

/* What does the "- '0'" part do?

因为&#39; 0&#39;是从字符&#39; 0&#39;中减去该值的第一个ASCII数字。到&#39; 9&#39;它实际上是转换为数值。

答案 3 :(得分:1)

假设您的问题是代码中的注释:

这对&#39;是什么?循环吗?

第一个循环清除一个数组。在C中,对字符串进行操作的所有函数都使用字节值0来表示字符串的结尾。

为什么数字在引号中?

单引号中的任何内容都表示引号中字符的ASCII值,因此&#39; 0&#39; 0是0的ASCII值,即48

&#34; - &#39; 0&#39;&#34;部分吗?

这样表达式将从&#39; 0&#39;的ASCII值中减去输入的ASCII值。获取数值。即&#39; 0&#39; 0 - &#39; 0&#39;会给0,&#39; 1&#39; - &#39; 0&#39;给1等。