2016-03-12 3 views
-3

У меня проблема с чтением символов со входа. Программа должна закончиться, когда я нажимаю ENTER или CTRL + Z.EOF in C не работает

Пример ввода: LoreCTRL + Z .... на велосипеде , но когда я нажимаю CTRL + Z, и нет никакого текста перед ним, он работает. Может ли кто-нибудь мне помочь? Благодаря

int intFromConsole = getchar(); 
if((intFromConsole == EOF) || (intFromConsole == '\n')){ 
    //code 
} 
+1

[Это] (http://stackoverflow.com/a/16786922/5647037) может помочь вам с проблемой CTRL + Z. какая у вас другая проблема? – Vucko

+0

Вы можете найти заметку в [этом ответе] (http://stackoverflow.com/a/22719565/1322972). – WhozCraig

+2

Что такое «велосипедный спорт»? –

ответ

2

Это, вероятно, не имеет отношения к вашей программе, но к терминальной подсистеме (в ядре), который отвечает за такое поведение.

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

Еще один улов, вы обычно не должны ожидать ввода Ctrl + Z (ASCII 26), поскольку он перехвачен терминальной подсистемой в большинстве состояний терминала, что приостанавливает вашу программу и отправляет ее на задний план.

Вы можете получить более интересную информацию из статьи Линус Акессона The TTY demystified.

1

Функция getchar() использует буферизованный вход. В Windows Ctrl-Z распознается только в том случае, если он соответствует записи newline. Но в Windows у вас может быть conio.h, доступный вам в библиотеке. Если это так, вам нужно поэкспериментировать. Он принимает каждое нажатие клавиши сразу и печатает значение в шестнадцатеричном формате. Он выходит, когда нажата кнопка Ctrl-Z.

#include <stdio.h> 
#include <conio.h> 

#define ENDOF 0x1A  // Ctrl-Z 

int main(void) { 
    int ch; 
    do { 
     ch = _getch(); 
     printf("%02X\n", ch); 
    } while(ch != ENDOF); 
} 

вход Программа

1234<Ctrl-Z> 

выход программы

31 
32 
33 
34 
1A 
0

Программа должна заканчиваться при нажатии ENTER или CTRL + Z.

Если выше, что вы хотите, вы могли бы что-то сделать g like:

int main(void) 
{ 
     char ch; 

     do 
     { 
       while(ch!='\n') 
         getchar(); // waste the buffer 

       /* Do the useful stuff here */ 

       ch=getchar(); 
     }while(ch!=EOF && ch!='\n'); 

     /* Note the logical operator is && . It says if the key pressed 
     * is neither Enter nor Ctrl -Z do some stuff. 
     * The program exits only when you directly press Enter key or 
     * Ctrl -Z/Ctrl -D. Okay ! Now it is time to take a nice walk 
     * thru the Grand Central Park. 
     */ 

     return 0; 
} 

Для машин Linux Ctrl-Z генерирует SIGSTOP, который не может быть захвачен. Поэтому, чтобы сигнализировать EOF, вы должны использовать Ctrl-D.

Ссылки:

Linux Signals