none
C语言数组的一个小问题 RRS feed

  • 问题

  • 有段这样的程序 是统计输入的数字出现的次数的

    #include <stdio.h>
    #include <stdlib.h>

    int main(int argc, char *argv[])
    {
     
      int c,i
      int ndigit[10];

      for (i=1;i<10;++i)
         ndigit[i]=0;
     
      while ((c=getchar())!=EOF) {    
            if (c>='0' && c<='9')
               ++ndigit[c-'0'];           // 我的问题在这
            }
           
      printf("Digits=");
      for (i=0;i<10;++i)
           printf(" %d",ndigit[i]);
      
      system("PAUSE"); 
      return 0;
    }

    ---------------

    我的问题是 程序中的 ++ndigit[c-'0']; 这一句 为什么要用 c去-0 ?

    按照我的想法直接++ndigit[c];  不就可以了么?但直接这样写程序会出错 不知道什么原因

    还希望知道的朋友赐教 谢谢~!

    2009年12月11日 4:49

答案

  • ‘0’这是一个字符,实际的数值是它的ASC码 48。

    假如 c 是 ‘5' ,那它的值是 53. 你的ndigit只有10个元素,++ndigit[c] 自然就会越界。

    c - '0'  也就是 53 - 48. 数值为 5. 

    所以。。。
    • 已标记为答案 magic_os 2009年12月11日 11:17
    2009年12月11日 5:36
  • while ((c=getchar())!=EOF) 

    getchar读入的是 字符  不是实际的数值

    所以c的值   是所读入字符对应的ASCII 码
    c-‘0’才是数组对应元素的下标
    • 已标记为答案 magic_os 2009年12月11日 11:17
    2009年12月11日 6:21

全部回复

  • ‘0’这是一个字符,实际的数值是它的ASC码 48。

    假如 c 是 ‘5' ,那它的值是 53. 你的ndigit只有10个元素,++ndigit[c] 自然就会越界。

    c - '0'  也就是 53 - 48. 数值为 5. 

    所以。。。
    • 已标记为答案 magic_os 2009年12月11日 11:17
    2009年12月11日 5:36
  • while ((c=getchar())!=EOF) 

    getchar读入的是 字符  不是实际的数值

    所以c的值   是所读入字符对应的ASCII 码
    c-‘0’才是数组对应元素的下标
    • 已标记为答案 magic_os 2009年12月11日 11:17
    2009年12月11日 6:21
  • 谢谢上面两位~你们的回答互补!明白了 呵呵 ~!非常感谢~!
    2009年12月11日 11:18