Упражнение 1-12. Напишите программу, которая печатает свои входные данные по одному слову в строке

Изучая язык программирования C на языке K&R, я написал код для упражнения 1-12, который, по всей видимости, сработает. Однако мне стало любопытно, как его можно настроить для более длинного ввода, который бы занимал несколько строк. Текущая программа, которую я написал, завершает ввод, как только я нажимаю ввод. Есть ли способ настроить программу таким образом, чтобы ввод прерывался только по желанию, а не символом новой строки? Вот программа, которую я использовал.

#include <stdio.h>

main()
{
    int c;

    while ((c = getchar()) != EOF)
    {
        if ( c == ' ' || c == '\n' || c == '\t' || c == '-')
            putchar('\n');
        else
            putchar(c);
    }
}

Заранее спасибо.

5 ответов

Решение

Ваш код в порядке - проблема в том, что терминал по умолчанию буферизирует весь набранный вами контент, пока вы не нажмете Enter. Затем введенный вами контент фактически записывается в процессы stdin,

Чтобы делать то, что вы хотите, вы можете просто читать в строках, пока пользователь, например, не напечатает "print". Затем вы можете просмотреть каждый символ массива и сделать то же самое, что вы уже сделали.

Этот псевдо-C-код иллюстрирует, как вы можете решить эту проблему:

for(;;) {
    // create a buffer that will hold the entered lines
    char* buffer = ...;

    // read multiple lines from the terminal until user types "print"
    for(;;) {
        char* line = readLine();

        if(strcmp(line, "print") == 0) {
            break;
        } else {
            // add the entered line to the buffer (null-terminating)
            addLineToBuffer(buffer, line);
        }
    }

    // perform your output loop for the characters in the buffer
    char* pos = buffer;
    while(*pos) {
        if (*pos == ' ' || *pos == '\n' || *pos == '\t' || *pos == '-') {
            putchar('\n');
        } else {
            putchar(*pos);
        }
        ++pos;
    }
}

Программа будет получать ввод только в том случае, если вы нажмете клавишу ВВОД, так как обычный терминал работает в каноническом режиме. Так что то, что вы просите сделать, не прямо вперед. Тем не менее, вы можете использовать файл для ввода в вашу программу 1:

$./a.out < inputfile

или введите весь текст, используя здесь документ:

$./a.out << _TEXT
type all the 
text you want here
and terminate 
it with CTRL+D 
which sends EOF to your program
or type _TEXT

(1) Я предполагаю, что оболочка в стиле Unix. Windows powershell также предоставляет такие же возможности.

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

int c;
while ((c = getchar()) != EOF){
        if (c == ' ' || c == '\t'){
            putchar('\n');
            while ((c = getchar()) == ' ' || c == '\t');  
        }
        putchar(c);
      #include <stdio.h>
#define NONBLANK '-'
int main(){
    int c,lastc;
    lastc = NONBLANK;
    while ((c = getchar()) != EOF){
        if (c == ' ')
            if (lastc == ' ' || lastc == NONBLANK)
                ;
            else
                putchar('\n');
        else 
            putchar(c);
        lastc = c;
    }
}

Я думаю, что это сделает работу, но слабость этого кода заключается в том, что если вы поместите ' ' один или несколько раз в начале строки, он пропустит первую строку.

Этот код ниже работал для меня

      int main()
{
   
    int ch;
    while ((ch = getchar()) != EOF)
    {
        if (ch == ' ' || ch == '\t')
        {
            putchar('\n');
        }
        else
            putchar(ch);
    }
}```
Другие вопросы по тегам