我正在编写K& R C编程手册,我刚刚完成练习1-13,您可以在其中打印输入单词长度的直方图。我的水平直方图很好,但是我的垂直直方图在它的末尾出现了一个'%'符号,我无法弄清楚为什么会一直发生。以下是我认为导致问题的循环:
for (i = 0; i < array_length; i++) {
printf("%-4d", i + 1);
}
如果array_length是7,那么在第7个位置之后我会有一个'%'符号:
|
| |
| |
| |
| |
| |
| | | | |
| | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
1 2 3 4 5 6 7 %
如果我删除这个循环,垂直条打印很好,我只是没有得到它们下面的编号。
这里发生了什么?据我所知,printf在'i'中运行了一次额外的垃圾数据,但我无法弄清楚为什么或如何发生这种情况。
我在Ubuntu上使用gcc进行编译,如果这有任何区别的话。
以下是供您参考的完整代码:
#include <stdio.h>
#define IN 1
#define OUT 0
#define ARRAY_SIZE 1000
int main() {
int c, current_word_length, state, i, j, current_word, largest, array_length, top;
int word_lengths[ARRAY_SIZE];
current_word_length = current_word = largest = 0;
state = OUT;
for (i = 0; i < ARRAY_SIZE; i++) {
word_lengths[i] = 0;
}
printf("Enter up to 1000 words and this program will calculate their length.\n");
printf("Please enter a newline, tab, or space before the last word entered, then EOF to print summary.\n\n");
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\t' || c == '\n') {
if (state == IN) {
word_lengths[current_word++] = current_word_length;
if (current_word_length > largest) {
largest = current_word_length;
}
current_word_length = 0;
state = OUT;
}
} else {
state = IN;
current_word_length++;
}
}
array_length = current_word;
printf("\nWord Lengths Histogram Horizontal:\n\n");
for (i = 0; i < array_length; i++) {
printf("%-4d: ", i + 1);
for (j = 0; j < word_lengths[i]; j++) {
printf("=");
}
printf("\n");
}
printf("\nWord Lengths Histogram Vertical:\n\n");
top = largest;
while (top > 0) {
for (i = 0; i < array_length; i++) {
if (word_lengths[i] >= top) {
printf("%-4c", '|');
} else {
printf("%-4c", ' ');
}
}
printf("\n");
top--;
}
for (i = 0; i < array_length; i++) {
printf("%-4d", i + 1);
}
return 0;
}
以下是我期望使用此输入字符串“Bacon ipsum dolor amet frankfurter landjaeger ham”发生的事情:
Enter up to 1000 words and this program will calculate their length.
Please enter a newline, tab, or space before the last word entered, then EOF to print summary.
Bacon ipsum dolor amet frankfurter landjaeger ham
Word Lengths Histogram Horizontal:
1 : =====
2 : =====
3 : =====
4 : ====
5 : ===========
6 : ==========
7 : ===
Word Lengths Histogram Vertical:
|
| |
| |
| |
| |
| |
| | | | |
| | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
1 2 3 4 5 6 7
答案 0 :(得分:0)
好的,正如评论中的nos和chqrlie所指出的,我需要在程序结束时添加换行符,以便在程序运行完毕后shell命令提示符出现在换行符上。
在main()的末尾添加putchar()调用修复了我的问题:
for (i = 0; i < array_length; i++) {
printf("%-4d", i + 1);
}
putchar('\n');
return 0;
} // end main()