控制台

时间:2017-02-20 22:27:29

标签: c console printf

我正在编写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

1 个答案:

答案 0 :(得分:0)

好的,正如评论中的nos和chqrlie所指出的,我需要在程序结束时添加换行符,以便在程序运行完毕后shell命令提示符出现在换行符上。

在main()的末尾添加putchar()调用修复了我的问题:

  for (i = 0; i < array_length; i++) {
    printf("%-4d", i + 1);
  }

  putchar('\n');

  return 0;
} // end main()