C:无法理解以下数组赋值

时间:2009-08-17 22:40:04

标签: c arrays

问题说明了一切:

...
int ndigit[10];
...//fill in the array with 0s

while((c = getchar()) != EOF)
    if(c >= '0' && c <= '9')
         ++ndigit[c - '0']; //<== unable to understand this part
据推测,该数组存储来自输入流的输入数字字符......

9 个答案:

答案 0 :(得分:12)

在C中,您可以使用字符代码对字符进行算术运算。因此,这确保您有一个数字,找出它是哪个数字(通过测量它与零的差异),然后增加数组中相应位置的计数。完成后,ndigit[0]将包含'0'的出现次数,ndigit[1]将包含'1'的出现次数,依此类推。

答案 1 :(得分:8)

正在创建字符0-9的直方图。 “c-'0'”将getchar()中的值转换为整数,该整数充当数组的索引。该索引对应于数字0-9。然后它增加该阵列位置。因此,一旦完成运行,该数组就包含字符0-9的重复。

所以0123456789 应该导致所有的数组。 0123333 应该得到一个值为1114000000的数组。

答案 2 :(得分:6)

字符0与数字0不同。

在ASCII中,字符“0”位于48位置。该标准保证在字符编码中,数字必须是连续的(我不知道标准在哪里说)。也就是说,就像1在0之后,'1'将在'0'之后。因此,如果您输入'0',并且想要得到0,则从中减去'0'。 “1”减去“0”的差异为1.依此类推。

答案 3 :(得分:1)

getchar()将返回字符的字符代码作为int。查看ASCII图表,例如:http://www.cs.utk.edu/~pham/ascii_table.jpg

因此,如果输入'0'c将是48.从输入值减去'0'就像减去48一样,所以你最终会得到整数数组中的int值0..9 / p>

答案 4 :(得分:1)

c - '0'将字符从其ASCII代码转换为值本身。这成为了数组索引。数组下标运算符的优先级高于preincrement,因此结果索引处数组中的值将递增。

答案 5 :(得分:1)

part [c - '0']为ndigit []创建一个从零开始的索引。它通过取c(其中ASCII值在48到57范围内)并减去48(ASCII值为'0')来实现这一点

答案 6 :(得分:1)

POSIX和ISO C都需要:

  

与之关联的编码值   数字0到9应该是这样的   0之后每个字符的值   比一个人的价值更大   以前的角色。

答案 7 :(得分:1)

在这里使用 ASCII值减,这意味着'0'=> ASCII值是48,而'1'=> ASCII值是49。

printf("%d",'0');  // 48 value
printf("%d",'1');  // 49 value 
....
printf("%d",'9');  // 57 value 

然后减去这个值。

当c为1时

[c-'0'] = 1;

[49-48] = 1;

答案 8 :(得分:0)

这是从'0'到'9'的输入符号的增量计数器。

e.g。

如果ndigit [1]为2时你把'1'放两次, 如果当ndigit [5]为1时,你将'5'置为',' 如果ndigit [0]将5000000 =)

,则将'0'设置为5000000次

......等等。