Начинающий здесь.

В учебнике ANSI C от K & R, стр. 20, они спрашивают: Как бы вы протестировали программу подсчета слов?

Я скопировал точно из учебника, используя IDE CodeBlocks, консольное приложение. Я видел много отличных тестов ввода онлайн, но мой вопрос еще тупее. Как мне на самом деле что-то ввести? Ничего не происходит, когда я нажимаю Enter. У меня есть эта проблема, потому что я использую IDE и поэтому не учусь правильно запускать программы на C? Заранее спасибо. Я добавил картинку, чтобы показать вам, что я имею в виду

Вот код:

#include <stdio.h>

#define IN 1    /* inside a word */
#define OUT 0   /* outside a word */

/* counts lines, words and characters as input */

main()
{
    int c, nl, nw, nc, state;

    state = OUT;
    /* set these three constants to 0: */
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF){
        ++nc;
        if (c == '\n')
            ++nl;
            /* || == OR (&& == AND)
            evaluation of the following line
            will stop as soon as the truth or
            falsehood is known, so the order matters */
        if (c == ' ' || c == '\n' == c == '\t')
            state = OUT;
        else if (state == OUT){
            state = IN;
            ++nw;
        }
    }
    printf("%d %d %d\n", nl, nw, nc);
}
c io
0
Asger Skov Velling 6 Апр 2020 в 17:22

2 ответа

Лучший ответ

Программа для подсчета слов в K & R 2nd edition предназначена для работы в среде, в которой вы как-то сигнализируете о конце ввода. Обычно, так как они использовали UNIX все время, они использовали последовательность Ctrl-D (которая действительна, если вы запускаете программу в Linux или любой Unix-подобной операционной системе). Это было так с самого раннего начала системы UNIX.

Windows сигнализирует об окончании ввода в консольном приложении вводом Ctrl-Z (вероятно, за которым следует клавиша возврата на клавиатуре)

Если вы перенаправите ввод из файла (как, например, a.out <my_input_file.txt), вы получите количество слов в конце, когда в файле больше нет ввода.

Вы запускаете программу в среде IDE, которая обычно скрывает вас там, где идут стандартный ввод и стандартный вывод, или как сигнализировать окну, которое вы показываете, как сказать, что для программы больше нет ввода.

Чтобы программа достигла своего конца, вы должны сначала узнать, как завершить ввод.

0
Luis Colorado 7 Апр 2020 в 14:21

Примеры в K&R опускают тип возврата main, который недопустим в современном C, поэтому добавьте int перед main():

#include <stdio.h>

#define IN 1    /* inside a word */
#define OUT 0   /* outside a word */

/* counts lines, words and characters as input */

int main()
{
    int c, nl, nw, nc, state;

    state = OUT;
    /* set these three constants to 0: */
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF){
        ++nc;
        if (c == '\n')
            ++nl;
            /* || == OR (&& == AND)
            evaluation of the following line
            will stop as soon as the truth or
            falsehood is known, so the order matters */
        if (c == ' ' || c == '\n' == c == '\t')
            state = OUT;
        else if (state == OUT){
            state = IN;
            ++nw;
        }
    }
    printf("%d %d %d\n", nl, nw, nc);
}

" Как мне на самом деле что-то ввести? Когда я нажимаю клавишу ввода, ничего не происходит. "

Если у вас возникли проблемы с вашей IDE, просто запустите ее онлайн.

" Как бы вы протестировали программу подсчета слов "?

Чтобы процитировать авторов пакета решений K&R с ответом на этот конкретный вопрос, здесь:

Похоже, они действительно пытаются заставить программистов научиться выполнять модульный тест. Я хотел бы представить следующее:

  1. входной файл содержит ноль слов
  2. входной файл содержит 1 огромное слово без каких-либо переносов
  3. входной файл содержит все пробелы без перевода строки
  4. входной файл содержит 66000 символов новой строки
  5. входной файл содержит слово / {огромная последовательность различных> типов пробелов} / слово
  6. входной файл содержит 66000 однобуквенных слов, 66 в строку
  7. входной файл содержит 66000 слов без перевода строки
  8. входной файл - / usr / dict content (или эквивалентный)
  9. входной файл - полная коллекция слов
  10. входной файл является двоичным (например, его собственный исполняемый файл)
  11. входной файл / dev / null (или эквивалентный)

66000 выбран для проверки целостного переполнения на маленьких целочисленных машинах.

0
RobertS supports Monica Cellio 6 Апр 2020 в 15:47