Как получить программу, использующую getchar для запуска? - PullRequest
4 голосов
/ 05 января 2010

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

Я использую Dev-C ++ (компилятор mingW) на XP и запускаю программы из командной строки. Моя проблема в том, что когда я пытаюсь запустить свою программу, она ждет ввода символов для сканирования, но когда я заканчиваю ввод и нажимаю 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;
}

Ответы [ 3 ]

7 голосов
/ 05 января 2010

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

В Windows вам нужно набрать ctrl-z для имитации конца файла.

1 голос
/ 05 января 2010

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

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

1 голос
/ 05 января 2010

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

...