Нет новой строки после ввода в C - PullRequest
1 голос
/ 26 апреля 2010

Как я могу запретить данному приложению создавать новую строку ('\ n') после того, как я запрашиваю ввод пользователя в C? Я хотел бы что-то вроде:

Type a number
Number: 3x10 = 30

"x10 = 30" добавляется после того, как пользователь вводит число. Проблема в том, что я не могу сделать это в одной строке (и я бы хотел это сделать).

Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 26 апреля 2010

Это невозможно в простом C, и часто вообще невозможно. Причина заключается в буферизации, входные потоки ждут символа (обычно ввод), чтобы отправить данные процессорам (например, scanf, gets, getchar, ...). Прежде всего, сам STDIN буферизуется. Вы можете отключить это, используя setvbuf : setvbuf ( stdin, NULL, _IONBF, 0), который я однако не рекомендую. Это также означает, что вам придется самостоятельно обрабатывать возвраты и другие управляющие символы, безобразный материал (используйте telnet в течение некоторого времени, если хотите знать, насколько это болезненно).

Во-вторых, терминал, в котором вы работаете, часто будет также использовать буферы, даже если вы отмените буферизацию в C, этот будет буферизоваться до тех пор, пока не будет нажата клавиша enter. Вы также можете попытаться найти специфичные для системы способы отключения буферизации, но, насколько я знаю, они существуют не для каждой системы / терминала.

Если вы хотите управлять выводом на этом уровне, понадобятся системные API или даже создание пользовательских консолей.

1 голос
/ 26 апреля 2010

Как сказал KillianDS, большинство терминалов буферизуют ввод автоматически, поэтому вы должны сообщить терминальному интерфейсу, что вы хотите использовать необработанный / небуферизованный ввод. К сожалению, способ сделать это будет различным в большинстве систем.

В системах UN * X проверьте команду stty (например, stty raw для установки небуферизованного и stty sane для возврата в нормальное состояние, они могут быть вызваны через system или из семейства execl). Вы также можете использовать команду tcsetattr из интерфейса termios.

...