我正在读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 :(得分:1)
数字'0'
.. '9'
的字符代码是连续数字,通常是48 .. 57.如果c
在'0'
到{{1}的范围内('9'
测试已检查过),如果字符为if
,则ndigit[c-'0']++
会增加下标0
的计数,如果'0'
,则为9
增加字符为'9'
,两者之间的值类似。 (请注意,您可以使用任何整数值表达式作为下标 - 但该值必须在数组的有效下标范围内,或者行为未定义 - C中的专用术语表示'任何事情都可能发生,包括它可能像预期的那样工作,或者使程序或计算机崩溃,或者......任何东西'。)
C要求10位数字具有连续的代码值,'0'
编码低于'1'
。请注意,用于将0视为10的电话(很难发现0次点击,但在旋转手机的日子里很难发现10次点击)。
答案 1 :(得分:0)
c-'0'
将字符转换为整数:
因此,ndigit[c-'0']
指的是当前字符的计数器。
答案 2 :(得分:0)
在C中,为每个角色分配一个值。您可以查看here '0'的值为 48 ,'9'的值为 57 。
由于c-'0'
中的ndigit[c-'0']
需要是 0 和 9 之间的值,您只需减去'0'强>
答案 3 :(得分:0)
c == '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'
之间的内容。
答案 4 :(得分:0)
使用c-'0'
,您将从ASCII值获得实数值。
看看ASCII table。您可以使用'1'
加载的字符getchar()
具有ascii值 49 。如果您从中减去字符'0'
的值,则会得到实数值 1 。
答案 5 :(得分:0)
所以开始关闭while循环直到你输入End of File
(在Windows Ctrl + Z
上;在Unix系统上Ctrl + D
)
在此之前,它每次都会读取1个字符。然后它通过if
语句来检查它是一个数字(0-9
)还是一个新行(\n
),空格([space here]
),tab({{ 1}})或其他。
它增加(+1)特定变量或增加数字的特定数组索引。 (这个:\t
是将字符转换为int,因此您可以访问该数组并增加特定值,这预示着您已使用0初始化数组。)
最后会打印您输入的字符/数字。
答案 6 :(得分:0)
在计算机的内存中,所有字符都用整数表示,即它们的代码。
在C程序中,根据使用的编码,'0'
(一个char
字面值)本质上是字符0的整数值(代码)。
在现代系统中,字符0的代码为48,字符1的代码为49等(请参阅ASCII encoding。)因此,'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开始)项。