Есть ли способ печатать, пока getchar еще не получил новую строку

Я хочу печатать новую строку ('\n') при захвате пробела char (' ') при чтении строк char за char с помощью getchar(). код:

#include <stdio.h>

int main(void) {
    char c;
    int nl;

    nl=0; /* holds number of consecutive newline char */

    while (nl<2) {
    /* the loops  ends when getchar() receives
       two consecutive newline inputs */
       c=getchar();
       if (c==' ')
           putchar('\n');
       else if (c=='\n')
           nl++;
       else
           nl=0; 
    }

    getchar();
    return 0;
}

Программа ничего не печатает, пока не получит символ новой строки ('\n')

Я использую: gcc версии 3.4.2


person WannaBeGenius    schedule 08.05.2014    source источник
comment
я полагаю, вы заинтересованы в многопоточности.   -  person Gershy    schedule 08.05.2014
comment
@GershomMaes Я не думаю, что проблема настолько сложна   -  person SimpleJ    schedule 08.05.2014
comment
@LoganMurphy: я отредактировал вопрос   -  person WannaBeGenius    schedule 08.05.2014
comment
@SimpleJ, вы правы - я был введен в заблуждение заголовком и недостаточно внимательно прочитал вопрос.   -  person Gershy    schedule 08.05.2014


Ответы (1)


Ваша проблема заключается в том, что при нормальных обстоятельствах терминал, на который вы вводите, запускается в «каноническом режиме», где ядро ​​​​буферизирует весь ввод (и обеспечивает базовое редактирование строки, например, backspace) до тех пор, пока не будет нажата клавиша ввода, а затем отправляет данные через устройство как единое целое.

Вы можете отключить это поведение, отключив бит ICANON члена c_lflag структуры termios, используя функции tcgetattr и tcsetattr (не забудьте восстановить старый режим перед выходом из программы), но тогда у вас будет много работы сделать, чтобы вернуться к исходному поведению редактирования строки, если вы этого хотите. Вы также можете отключить другие флаги, такие как преобразование ввода/новой строки, эхо ввода и т. д., в зависимости от вашего варианта использования.

Некоторые люди могут посоветовать вам также отключить буферизацию на уровне stdio, вызвав setvbuf на stdin, но в этом нет необходимости, и это снизит производительность.

person R.. GitHub STOP HELPING ICE    schedule 08.05.2014
comment
это кажется немного сложным, но я буду искать его. Спасибо :) - person WannaBeGenius; 08.05.2014