есть ли способ остановить a (c = getchar ())! = EOF), если моя работа внутри while l oop завершена? - PullRequest
0 голосов
/ 03 августа 2020

Я читаю книгу по языку программирования C Денниса М. Ритча ie и пытаюсь решить этот вопрос:

Напишите программу для печати гистограммы длин слов в ее ввод. Гистограмму легко нарисовать с горизонтальными полосами; с вертикальной ориентацией сложнее.

Я думаю, что мое решение работает, но проблема в том, что если я не нажму EOF, терминал не покажет результат. Я знаю, что это точно указано в условии, но мне интересно, есть ли способ завершить работу программы после прочтения одной строки? (Извините, если мое объяснение проблемы немного поверхностно. Не стесняйтесь спрашивать больше.)

#include <stdio.h>

int main ()
{
  int digits[10];
  int nc=0;
  int c, i, j;
  for (i = 0; i <= 10; i++)
    digits[i] = 0;
  //take input;
  while ((c = getchar ()) != EOF) {
      ++nc;
      if (c == ' ' || c=='\n') {
          ++digits[nc-1];
          //is it also counting the space in nc? i think it is,so we should do nc-1
          nc = 0;
       }
   }
   for (i = 1; i <= 5; i++) {
        printf("%d :", i);
        for (j = 1; j <= digits[i]; j++) {
            printf ("*");
        }
        printf ("\n");
   }  
   // I think this is a problem with getchar()
   //the program doesn't exit automatically
   //need to find a way to do it
}

1 Ответ

0 голосов
/ 03 августа 2020

Вы можете попробовать создать что-то вроде

while ((c = getchar ()) != EOF && c != '\n') {

, а затем добавить строку после while l oop, чтобы учесть последнее слово:

if (c == '\n') {
      ++digits[nc-1];
      nc = 0;

Также есть другая проблема внутри вашей программы. ++digits[nc-1]; правильный, но по неправильной причине. Вы должны сделать это, потому что массив начинается с нуля, т.е. если у вас есть массив длиной 10, он будет go от 0 до 9, поэтому вы должны подсчитать длину слов, а затем добавить единицу в позицию массива length - 1 (так как нет слов нулевой длины). Проблема в том, что вы все еще считаете пробелы или символы новой строки внутри слова, поэтому, если у вас есть два пробела после слова длиной 4, программа добавит в массив слово длиной 5 + a длина слова 1. Чтобы избежать этого, вы должны сделать что-то вроде этого:

while ((c = getchar ()) != EOF) {
      if ((c == ' ' || c == '\n' || c == '\t') && nc > 0) {
          ++digits[nc-1]; // arrays start at zero
          nc = 0;
      }
      else {
          ++nc;
      }
}
...