问题说明了一切:
...
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
据推测,该数组存储来自输入流的输入数字字符......
答案 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次......等等。