c - 这个数组在每种情况下都在做什么?

标签 c

我正在阅读 K&R 书,但我被数组卡住了(在简介中)。我不想在这里面提出更多问题,但这里的“一般问题”是我不明白如何使用数组,我觉得这本书在介绍时对它们的解释很差。 该程序计算数字(分别)、空格和其他。

#include <stdio.h>

int main(void)
{
    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(", blanks = %d, other = %d\n", nwhite, nother);

    return 0;
}

我确实明白第一个“for”是将 ndigit[i] 的每个值设为 0。之后我就失去了它。它说“如果 i 等于 0 或 9,ndigit[c-'0'] 是什么意思?”真的,那个'0'是什么。最后一部分是它用 i 做了另一个 'for',如果 i 在 ndigit 中,i 的值发生了什么变化? 我不应该问这个;这太新手了,但我不知道还能从哪里获得帮助。

最佳答案

数字'0' .. '9'的字符编码是连续的数字,通常是48 .. 57。如果c'0''9' 范围内(if 测试已检查),然后是 ndigit[c-' 0']++ 如果字符为 '0',则下标 0 增加计数,如果字符为 9,则下标 9字符是 '9',对于介于两者之间的值也是如此。 (请注意,您可以使用任何整数值表达式作为下标 - 但该值需要在数组的有效下标范围内,否则行为未定义 - C 中的一个专门术语,意思是“任何事情都可能发生,包括它可能按预期工作,或者使程序、计算机崩溃,或者……任何事情。)

C 要求 10 位数字具有连续的代码值,'0' 的编码低于 '1'。请注意,电话过去会将 0 视为 10(很难发现 0 次点击,但在旋转电话时代却不难发现 10 次点击)。

关于c - 这个数组在每种情况下都在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28268606/

相关文章:

c++ - wchar_t 到 unsigned char 的转换

c - 如何使用lapack库解决c中矩阵乘法的链接器错误?

objective-c - 在 C 和 Objective C 中,我们是否应该几乎永远不要仅使用 (int) 将 float 或 double 值转换为整数?

c - 在 C 中打印不同格式的文件时需要帮助吗?

c - 代码 "should"有效,但程序停止工作

c - 来自 int 的基本 C 强制转换警告指针

c - fgets 中的段错误

CaptureStackBackTrace 和 SymGetLineFromAddr64 无法获取行信息返回错误代码 487

位字段只能是结构/union 的字段,而不是 "normal"、 "stand-alone"变量吗?

c - 1 到 3 之间的随机数