【发布时间】:2016-08-15 17:42:44
【问题描述】:
我很难理解教授对一个计算字符数组中位数的程序的解决方案。
int main(void)
{
char* s[] = {"12, 34, 56, 78",
"82.16, 41.296",
"2, -3, 5, -7, 11, -13, 17, -19",
"9.00009, 90.0009, 900.009, 9000.09, 90000.9"};
int i, rows = sizeof(s)/sizeof(s[0]);
for(i = 0; i < rows; i++) {
digitCounts( s[i] );
}
}
void digitCounts(char* s) {
int counts[10] = { 0 };
int i = 0;
while( s[i] != '\0' )
{
if('0' <= s[i] && s[i] <= '9')
counts[ s[i] - '0' ]++;
i++;
}
for(i = 0; i < 9; i++)
printf("%d, ", counts[i]);
printf("%d\n\n", counts[i]);
}
有人可以帮我具体理解这部分吗:
while( s[i] != '\0' )
{
if('0' <= s[i] && s[i] <= '9')
counts[ s[i] - '0' ]++;
i++;
}
我理解 while 循环条件:如果 s[i] 处的元素不等于 NUL,则继续。但是 if 语句让我感到困惑,因为您是在比较数值还是字符串值?字符串值如何大于或小于另一个值?例如'1'
请帮助我真的迷路了!
【问题讨论】:
-
首先 - 这些是“字符值”,而不是“字符串值”。第二:你听说过ASCII编码吗?
-
他只是检查单个字符的 ASCII 值是否介于或包括字符“0”和“9”的 ASCII 值之间。它们在 ASCII 表中连续排列,这就是为什么您可以只检查上限和下限。
-
counts[ s[i] - '0' ]++;将s[i]处的字符转换为基于0 的字符,方法是减去范围内的最低字符值'0',然后计算该数字在counts[]中的出现次数具有该索引的数组元素。 -
这里没有任何东西表明执行字符集是ASCII。很多时候,了解确切的字符集和编码是至关重要的(它很少是 ASCII)。但是,这是可移植的 C 代码,它仅依赖于 C 系统的要求,即具有 '0'-'9' 作为连续的
char值。执行此操作的代码是s[i] - '0',它是一个表达式,用于计算已知 0-9 数字字符与“0”字符的“距离”。所以,如果你正在查看一个 ASCII 表,你就犯了一个错误。这次不会痛了,但是……。