我目前正在阅读这本书: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;)。
任何建议/解释都会非常感激。
提前致谢:)
答案 0 :(得分:3)
if
语句检查字符是否为数字,++ndigit[c-'0']
语句更新该数字的计数。如果c
是'0'
和'9'
之间的字符,则c-'0'
是0
和9
之间的数字。换句话说,'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]已更新
查看重新考虑的代码希望它可以帮到你,Happy Coding