Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在每种情况下,此阵列都在做什么?_C - Fatal编程技术网

C 在每种情况下,此阵列都在做什么?

C 在每种情况下,此阵列都在做什么?,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;

我正在读《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;
}
#包括
内部主(空)
{
int c,i,nwhite,other;
int-ndigit[10];
nwhite=nother=0;
对于(i=0;i<10;++i)
{
ndigit[i]=0;
}
而((c=getchar())!=EOF)
{

如果(c>='0'&&c
c-'0'
将字符转换为整数:

  • “0”成为整数0
  • “1”变为1

因此,
ndigit[c-'0']
指的是当前字符的计数器。数字的字符代码
'0'
'9'
是连续的数字,通常为48..57。如果
c
'0'
'9'
的范围内(如果
测试已选中该范围),则
ndigit[c-'0']++
如果字符为
'0'
,则递增下标
0
的计数;如果字符为
'9'
,则递增下标
9
的计数;对于介于两者之间的值,则递增计数。(请注意,您可以使用任何整数值表达式作为下标-但该值必须在数组的有效下标范围内,或者行为未定义-这是C语言中的一个专门术语,表示“任何事情都可能发生,包括它可能按您的预期工作,或使程序或计算机崩溃,或…任何事情”。)


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

在C中,每个字符都分配了一个值。您可以查找它们。
'0'的值为48'9'的值为57


由于
ndigit[c-'0']
中的
c-'0'
需要是介于09之间的值,因此当
c='0'
时,只需减去'0'

c-'0'
等于
0

c=='9'
时,
c-'0'
等于
9

c
介于
'0'-'9'
之间时,可以对值进行插值

c-'0'
等于
0

++ndigit[c-'0'];
递增
ndigit[0]
的值

c-'0'
等于
9

++ndigit[c-'0'];
递增
ndigit[9]
的值


c
介于
'0'-'9'

之间时,您可以使用
c-'0'
对发生的情况进行插值,您将从ASCII值中获取实数值


请看一看.Character
'1'
,您可以使用
getchar()
加载它,它的ascii值为49。如果您从中减去Character
'0'
的值,您将得到实值1

,因此开始while循环运行,直到您输入文件的
结尾(在Windows上
Ctrl+Z
;在Unix系统上
Ctrl+D

在此之前,它每次读取1个字符。然后它通过
if
语句检查它是数字(
0-9
)还是新行(
\n
)、空格(
[space here]
)、制表符(
\t
)或其他内容

它增加(+1)特定变量或在特定数组索引处的数字。(这:
c-'0'
是将字符转换为int,因此您可以访问数组并增加特定值,前提是您已使用0初始化数组。)


最后,它会打印您输入的字符/数字。

在计算机内存中,所有字符都用整数表示,即它们的代码

在C程序中,
'0'
(a
char
literal)根据所使用的编码,本质上是字符0的整数值(code)。 在现代系统中,字符0的代码是48,字符1的代码是49,等等。所以,
'0'==48
'1'==49
等等

在这个程序中,一个字符数字(即一个数字的代码)被转换成该数字的数值,因此
ndigits[0]
将计数为零,
ndigits[1]
将计数1等。
c-“0”
使用数字编码密集且编码表中的数字有序的事实执行此转换

 c  |  c - '0'
----+--------------------------
'0' |  '0' - '0' = 48 - 48 = 0
'1' |  '1' - '0' = 49 - 48 = 1 (Code of '1' is 49.)
'2' |  '2' - '0' = 50 - 48 = 2 (Code of '2' is 50.)
   ...
'9' |  '9' - '0' = 57 - 48 = 9

ndigits[i]
表示
i
-数组的第项
ndigits
。例如,当
i
为0时,
ndigits[i]
=
ndigits[0]
=第一项(索引从0开始)数组项。

了解代码如何工作的一个好方法是在调试器中运行它,单步执行代码并观察变量如何变化。嗨,Paul,我对你的评论很感兴趣,我使用的是code::Blocks,我不太了解如何在debug中运行它。我不熟悉code::Blocks,但几乎不了解任何resPropectable IDE应该让你做基本的源代码级调试。它有手册吗?呃,我回答得太晚了,我真的不知道它是否有手册,你看我开始编程时非常粗糙,首先是兴趣,然后我才开始编写我学到的东西,如果你知道一个优秀的IDE,告诉我,我确实喜欢Code::Blocks但我见过使用Dev-C++和其他一些人,我只是熟悉Code::Blocks,所以你的建议会很有用。对不起,我不是Windows用户,所以我不知道向初学者推荐什么。我知道你可以从Microsoft thoug获得Visual Studio的免费版本