Как мне запустить программу, использующую getchar?

StackOverflow https://stackoverflow.com/questions/2002522

  •  18-09-2019
  •  | 
  •  

Вопрос

Я полный профан, пытаюсь выучить себя C от K & R.Мой вопрос в некотором роде смущающе элементарен.Ладно, поехали:Я не могу заставить программы, использующие getchar, выдавать тот результат, который я ожидал.Если у вас случайно есть K & R под рукой, я застрял на упражнении 1.13.Вопрос звучит так: "Напишите программу для печати гистограммы длин слов во входных данных." и я даже не могу взяться за горизонтальную версию из-за этой проблемы, которая у меня возникла.

Я нахожусь на XP, используя Dev-C ++ (компилятор MinGW) и запуская программы из командной строки.Моя проблема в том, что когда я пытаюсь запустить свою программу, она ждет, пока я введу символы для сканирования, но когда я заканчиваю ввод и нажимаю Enter, этого не происходит что угодно.Я ожидаю, что он продолжит работу и выведет гистограмму, как я и ожидал.На самом деле, похоже, что он даже не подсчитывает длину слов, потому что, как вы можете видеть в коде, когда я пытаюсь напечатать то, что находится в массиве ctr, просто чтобы посмотреть, содержит ли он что-нибудь, ничего не печатается.

Я настолько n00b, что понятия не имею, виноват ли в этом мой код или командная строка.Но я подозреваю, что это что-то с системой, потому что когда я пытаюсь скомпилировать и запустить типовая программа, происходит то же самое.Введите ввод, нажмите Enter, ничего не произойдет.Если я нажму Ctrl-C, иногда он выдает одну или две звездочки, которые совсем не похожи на выходные данные модели.В других случаях это ничего не делает (просто возвращается к командной строке).

Вот мой код для этого упражнения.Я потратил на это целый день и сомневаюсь в своей способности продолжать заниматься программированием.Я был бы очень, очень признателен, если бы кто-нибудь смог вытащить меня из этой дыры!

Кроме того, у меня есть еще один вопрос о модельной программе, о которой я упоминал выше, но я думаю, что мне следует опубликовать его в отдельном вопросе.Спасибо всем :)

#include <stdio.h>

//#define 1 IN
//#define 0 OUT
int main () {
    //start w/ state = OUT
    int c = 0;
//    int state = OUT;
    int len = 0;
    int ctr[12];
    int i, j;
    i = j = 0;

    for (i = 0; i <12; i++)
        ctr[i] = 0;
    while ((c = getchar()) != EOF)
       if (c != ' ' && c != '\t' && c != '\n') {
//            state = IN;
            len++;
            printf("%d", len);
            }
       else {
            ctr[len]++;
            len = 0;
            }            
    for (i = 0; i <12; i++) 
        printf("%d\n", ctr[i]);
    for (i = 0; i <12; i++) {
        printf("%d\n", i);   
        for (j = 0; j <= ctr[i]; j++)
            printf("-");
        printf("\n");
        }
    return 0;
}
Это было полезно?

Решение

Ваш цикл while ищет EOF, который обозначает конец файла, а не конец строки.

В Windows вам нужно ввести ctrl-z, чтобы имитировать конец файла.

Другие советы

Не похоже, что вы на самом деле храните c (свой ввод) где бы то ни было...ни печатать его.Вы печатаете размер строки, но не сами символы.Если у вас ctr[i] = c;где-нибудь (это вы добавляете символ в массив), а затем печатаете массив, вы увидите свои входные данные.О, и да, ответ о ctrl-z также важен.Кроме того, если вы совершенно не знакомы с языком, я бы настоятельно рекомендовал вам заключить содержимое while в квадратные скобки.Пройдет некоторое время, прежде чем вы сможете просто взглянуть на код и узнать, что подпадает под действие цикла while, а что нет, если вокруг него не будет фигурных скобок.

Я не увидел ничего действительно неправильного в коде, поэтому я загрузил его в gcc, и, похоже, он работает нормально, если вы помните, что вам нужно ввести EOF (CTRL-D), чтобы завершить цикл while.Я ввел 4 строки, и хотя я не могу сделать никаких заявлений о правильности ответов, каждый раз, когда я нажимаю enter, я получаю серию чисел, равную количеству введенных мною символов, за которыми следует пробел.Это именно то, что ваш код предписывает делать.

Когда я ввел CTRL-D, я получил сводную информацию.Опять же, я не собираюсь делать никаких заявлений о корректности выходных данных, но я получил два основных раздела, как описано в вашем коде.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top