LINUX.ORG.RU

getchar/putchar


0

0

Я тут прогу накидал :)

#include <stdio.h>

int main(int argc, char *argv[]){
char ch;

while( ch=getchar() ){
if(ch==EOF) break;
putchar(ch);
}

}

если запустить, то по нажатию ентера она выплёвываетвсю строка которая была введена до этого... не представляю из-за чего это происходит, мож кто-нибудь объяснит ?

anonymous

Потому что прога твоя данные с терминала получит только по нажатию Enter'а или EOF.

Begemoth ★★★★★
()

о! то есть данные попадут в переменную после нажатия ентера ? не соглашусь... если переписать вот так

#include <stdio.h> int main(int argc, char *argv[]){ char ch; while( ch=getchar() ){ if(ch==EOF) break; putchar(ch); putchar('*'); } }

то будет вот так, т.е. обработка идёт посимвольно blah<enter> b*l*a*h* *

anonymous
()
Ответ на: комментарий от Begemoth

sorry, перепечатываю:

о! то есть данные попадут в переменную после нажатия ентера ? не соглашусь... если переписать вот так

#include <stdio.h>

int main(int argc, char *argv[]){
char ch;

while( ch=getchar() ){
if(ch==EOF) break;
putchar(ch);
putchar('*');
}

}

то будет вот так, т.е. обработка идёт посимвольно

blah<enter>
b*l*a*h*
*

anonymous
()
Ответ на: комментарий от anonymous

Блин, обработка идет по символьно в любом случае. Пока ты не нажмешь ENTER getchar будет ждать данных.

Begemoth ★★★★★
()

ой! кажется понял! спасибо

а кто тогда ответственнен за то, что я вижу символы, когда ввожу?

anonymous
()
Ответ на: комментарий от anonymous

blah<enter> <- вот до этого ENTER'а getchar будет ждать, потом 5 раз
               выдаст соответсвующие символы и опять будет ждать или
               новой строки или конца файла.
b*l*a*h*
* 

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

Begemoth ★★★★★
()
Ответ на: комментарий от php-coder

Один уровень буферизации ввода/вывода находится в ядре в драйвере терминала или линии (склероз, блин), второй - в libc. Первым можно поуправлять через tcsetattr (аналог stty -icanon), вторым , как уже правильно написали, через setvbuf.

Murr ★★
()

Кстати, замени

char ch;

на

int ch;

Иначе сравнение с EOF никогда не будет выполняться.

execve
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.