gpt4 book ai didi

c - 为什么 arr[1] 打印的内容看起来像是 arr[0] ?

转载 作者:行者123 更新时间:2023-11-30 17:41:25 26 4
gpt4 key购买 nike

下面的程序来自“C 答案书”的练习 1-13。这是为了理解和自学。

<小时/>

我为下面的问题做好了准备:

<小时/>
#define MAXWORD 11
<小时/>

数组 wl[ ] 的元素被初始化为零。

/* INITIALIZE WORD LENGTH COUNTER */
for (i = 0; i < MAXWORD; ++i) {
wl[i] = 0;
}

如果字长大于零且小于最大值,则将它们存储在数组中。

if (nc > 0) {
/* INCREMENT WORD LENGTH COUNTER */
if (nc < MAXWORD) {
++wl[nc];
}
...
}

下面的循环从 i = 1 开始。为什么 wl[1] 打印出看似 wl[0] 的内容?

/* PRINT COUNTER HEADER */
for (i = i; i < MAXWORD; ++i) {
printf("%5d - %5d : ", i, wl[i]);
...
}
<小时/>

额外信用!

请教我如何自己找到您的答案。

<小时/>

i = 0 时的输出

 0 -     0 : 
1 - 111 : ************
2 - 129 : ***************
3 - 31 : ***
4 - 42 : ****
5 - 32 : ***
6 - 24 : **
7 - 24 : **
8 - 13 : *
9 - 17 : *
10 - 6 : *
There are 9 words >= 11
<小时/>

i = 1 时的输出

 1 -   111 : ************
2 - 129 : ***************
3 - 31 : ***
4 - 42 : ****
5 - 32 : ***
6 - 24 : **
7 - 24 : **
8 - 13 : *
9 - 17 : *
10 - 6 : *
There are 9 words >= 11
<小时/>

完整的源代码:

/* Write a program to print a histogram of the lengths of words in
* its input. It is easy to draw the histogram with the bars horizontal; a vertical
* orientation is more challenging.
*
* 1 | ***
* 2 | ****
* 3 | ******
* 4 | *********
* 5 | **
* X | **********
*
* There were 7 words greater than 11 character.
* --------------------------------------------- */

#include <stdio.h>

#define MAXHIST 15 /* max length of histogram */
#define MAXWORD 11 /* max length of a word */
#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */

/* print horizontal histogram */
int
main(void)
{
int c, i, nc, state;
int len; /* length of each bar */
int maxvalue; /* maximum value for wl[] */
int ovflow; /* number of overflow words */
int wl[MAXWORD]; /* word length counters */

state = OUT;
nc = 0; /* number of chars in a word */
ovflow = 0; /* number of overflow words */
/* INITIALIZE WORD LENGTH COUNTER */
for (i = 0; i < MAXWORD; ++i) {
wl[i] = 0;
}
/* READ CHARACTERS UNTIL EOF */
while ( (c = getchar() ) != EOF) {
/* IF BLANK FOUND */
if (c == ' ' || c == '\n' || c == '\t') {
state = OUT;
/* IF WORD FOUND */
if (nc > 0) {
/* INCREMENT WORD LENGTH COUNTER */
if (nc < MAXWORD) {
++wl[nc];
}
/* INCREMENT OVERFLOW COUNTER */
else {
++ovflow;
}
}
nc = 0;
}
/* NEW WORD FOUND */
else if (state == OUT) {
state = IN;
nc = 1; /* beginning of a new word */
}
/* SAME WORD FOUND */
else {
++nc; /* inside a word */
}
}
maxvalue = 0;
/* FIND LARGEST WORD */
for (i = 1; i < MAXWORD; ++i) {
if (wl[i] > maxvalue) {
maxvalue = wl[i];
}
}
/* PRINT COUNTER HEADER */
for (i = 1; i < MAXWORD; ++i) {
printf("%5d - %5d : ", i, wl[i]);
/* FIND A COUNTER */
if (wl[i] > 0) {
/* SCALE ITS HISTOGRAM */
if ( (len = wl[i] * MAXHIST / maxvalue) <= 0) {
len = 1;
}
}
/* NO COUNTER FOUND */
else {
len = 0;
}
/* PRINT COUNTER LENGTH */
while (len > 0) {
putchar('*');
--len;
}
putchar('\n');
}
/* PRINT OVERFLOW COUNT */
if (ovflow > 0) {
printf("There are %d words >= %d\n", ovflow, MAXWORD);
}

return 0;
}

最佳答案

代码运行良好:wl 存储长度等于或小于 10 的单词计数(wl[1] 长度为 1 的单词数, wl[2] 长度为 2 的单词数,等等),因此 wl[0] 始终为 0,因为不存在长度为 0 的单词。

有时,当您使用数组时,您想忘记数组的位置从 0 到 n-1,并简化代码的其他部分,这就是这里发生的情况。

这就是它如何处理索引 0

#define MAXWORD 10                                  /* max length of a word */

...

int wl[MAXWORD]; /* word length counters */

/* INITIALIZE WORD LENGTH COUNTER */
for (i = 0; i < MAXWORD; ++i) {
wl[i] = 0;
}

...


/* IF WORD FOUND */
if (nc > 0) {
/* INCREMENT WORD LENGTH COUNTER */
if (nc <= MAXWORD) {
++wl[nc - 1];
}
/* INCREMENT OVERFLOW COUNTER */
else {
++ovflow;
}
}

...

for (i = 0; i < MAXWORD; ++i) {
printf("%5d - %5d : ", i+1, wl[i]);

...
}

++wl[nc - 1];printf("%5d - %5d : ", i+1, wl[i]); 很少见并且很难理解这个例子。代码没问题,但是为了澄清我认为作者试图做的事情,我会建议这个

#define MAXWORD 10                                  /* max length of a word */

...

int wl[MAXWORD + 1]; /* word length counters */

/* INITIALIZE WORD LENGTH COUNTER */
for (i = 1; i < MAXWORD; ++i) {
wl[i] = 0;
}

...


/* IF WORD FOUND */
if (nc > 0) {
/* INCREMENT WORD LENGTH COUNTER */
if (nc <= MAXWORD) {
++wl[nc];
}
/* INCREMENT OVERFLOW COUNTER */
else {
++ovflow;
}
}

...

for (i = 1; i <= MAXWORD; ++i) {
printf("%5d - %5d : ", i, wl[i]);

...
}

关于c - 为什么 arr[1] 打印的内容看起来像是 arr[0] ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21111870/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com