在线编译器 C

#include <stdio.h> void print_digit_count(char number[]) { int b[10]={0},n=0; while(!number[n])//tell me why this cant judge =='\0' in type 'char'?instead we should number[n]!='\0'??? b[(int)(number[n++]-'0')]++; for(int i=0;i<10;i++) printf("%d %d\n",i,b[i]); return ; } int main() { char q[1001]; scanf("%s",q); print_digit_count(q); return 0; }
这段代码的目的是统计输入字符串中每个数字字符(0-9)出现的次数。代码逻辑基本正确,但有一个关键错误导致循环无法正确执行。

问题出在 while 循环的条件判断上。你写的 `while(!number[n])` 意思是“当 number[n] 为假(即值为0)时继续循环”。但在C语言中,字符 `'\0'` 的ASCII码是0,所以 `!number[n]` 在遇到 `'\0'` 时确实为真,这会导致循环在字符串结束时继续执行,而不是停止。实际上,你希望的是“当 number[n] 不是 `'\0'` 时继续循环”,所以应该用 `number[n] != '\0'` 或直接 `number[n]`(因为非零为真)。

- 检查 while 循环的条件:`!number[n]` 在遇到 `'\0'` 时是 true,导致循环继续访问越界内存。应该改为 `number[n] != '\0'` 或 `number[n]`。
- 注意 `b[(int)(number[n++]-'0')]++` 这一行中,`n++` 的副作用:当 `number[n]` 不是数字字符时(比如空格或字母),`number[n]-'0'` 会得到负数或大于9的值,导致数组下标越界。