我是C的新手,我现在正试图通过Kernighan和Ritchie的书。我对他们用来引入数组的代码有疑问。
#include <stdio.h>
int main()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i) /* What does this 'for' loop do? */
{
ndigit[i] = 0;
}
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9') /* Why are the numbers in quotes? */
{
++ndigit[c - '0']; /* What does the "- '0'" part do? */
}
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);
}
答案 0 :(得分:1)
答案 1 :(得分:1)
我会尝试为您评论此代码。 请记住,ndigit是一个整数数组,初始化一个整数数组意味着通常将其所有值设置为零。
#include <stdio.h>
int main()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i) /* This loop initializes the ndigit array */
{
ndigit[i] = 0;
}
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9') /* c is a char, not an int */
{
++ndigit[c - '0']; /*a difference between two chars numeric values*/
}
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);
}
答案 2 :(得分:1)
来自您在代码评论中的问题:
/* What does this 'for' loop do? */
这个for循环从0迭代到9,为ndigit
中的每个元素赋值0。
/* Why are the numbers in quotes? */
函数getchar()
从stdin中获取一个字符,即用户输入。
Text是ASCII值的集合,可以使用单引号'a'
通过单个字符引用。
尽管getchar()
实际上返回char
值(1个字节),但实际返回值为int
,因此错误时会返回-1
。
因此,正在检查存储在char
中的int
值,以确保它在ASCII字符&#39; 0&#39;之间。和&#39; 9&#39;。 &#39; 0&#39;的ASCII值是48作为数值。
/* What does the "- '0'" part do?
因为&#39; 0&#39;是从字符&#39; 0&#39;中减去该值的第一个ASCII数字。到&#39; 9&#39;它实际上是转换为数值。
答案 3 :(得分:1)
假设您的问题是代码中的注释:
这对&#39;是什么?循环吗?
第一个循环清除一个数组。在C中,对字符串进行操作的所有函数都使用字节值0来表示字符串的结尾。
为什么数字在引号中?
单引号中的任何内容都表示引号中字符的ASCII值,因此&#39; 0&#39; 0是0的ASCII值,即48
&#34; - &#39; 0&#39;&#34;部分吗?
这样表达式将从&#39; 0&#39;的ASCII值中减去输入的ASCII值。获取数值。即&#39; 0&#39; 0 - &#39; 0&#39;会给0,&#39; 1&#39; - &#39; 0&#39;给1等。