在C编程中检查输入是否为数字

时间:2015-06-01 02:19:21

标签: c arrays digit

我目前正在阅读这本书:The C Programming Language - By Kernighan and Ritchie (second Edition)以及其中一个例子我无法理解如何检查输入是否为数字。这个例子在第22页,在数组章节下解释。

以下是示例。

#include <stdio.h>

 /* count digits, white space, others */

 main()
 {
   int c, i, nwhite, nother;
   int ndigit[10];

   nwhite = nother = 0;

   for (i = 0; i < 10; ++i)
   {
       ndigit[i] = 0;
   }

   while ((c = getchar()) != EOF)
   {
     if (c >= '0' && c <= '9')
     {
         ++ndigit[c-'0'];
     }
     else if (c == ' ' || c == '\n' || c == '\t')
     {
         ++nwhite;
     }
     else
     {
         ++nother;
     }

   printf("digits =");

   for (i = 0; i < 10; ++i)
   {
      printf(" %d", ndigit[i]);
   }

   printf(", white space = %d, other = %d\n",nwhite, nother);
 }

对于这个例子,让我困惑的是作者提到行++ndigit[c-'0']检查c中的输入字符是否是数字。但是,我认为只需要if语句( if (c>= '0' && c<= '9') ),它将检查c是否为数字。另外,我不明白为什么[c-'0']将检查输入(c)是否为数字,而输入变量(c)从字符串转换中减去(&#39; 0&#39;)。

任何建议/解释都会非常感激。

提前致谢:)

2 个答案:

答案 0 :(得分:3)

if语句检查字符是否为数字,++ndigit[c-'0']语句更新该数字的计数。如果c'0''9'之间的字符,则c-'0'09之间的数字。换句话说,'0'的ASCII值为48位小数,'1'为49,'2'为50,等等。c-'0'与{{1}相同},并将c-48转换为48,49,50,...

提高理解力的一种方法是在代码中添加0,1,2...,例如替换

printf

if (c >= '0' && c <= '9')
     ++ndigit[c-'0'];

答案 1 :(得分:0)

我会尝试用一个例子来解释

假设输入为abc12323

因此频率为1 = 1

频率2 = 2

频率为3 = 2

if (c >= '0' && c <= '9') //checks whether c is a  digit  
      ++ndigit[c-'0']; 

现在如果你做printf(“%d”,c)那么你将获得

的ascii值

字符

对于c ='0',ascii值将为48,c ='1'ascii值将为49并且它将

至57为c ='9'。

在你的程序中,你保持输入数字的频率,所以每次你得到它时你需要更新数组中的数字索引

如果你做了ndigit [c] ++那么它将更新ndigit [48]为c ='0',ndigit [49]为c ='1'

所以要么你可以做ndigit [c-'0'] ++ ascii值'0'= 48十进制

或者您可以简单地执行ndigit [c-48] ++,因此对于c ='0'更新ndigit [0],c = 1'

ndigit [1]已更新

您可以在http://ideone.com/nWZxL1

查看重新考虑的代码

希望它可以帮到你,Happy Coding