2015-11-08 8 views
0

пример кода (комментарии, что я предполагаю, что это делает для первого цикла):Почему не удается отменить отмену вызова getchar() в C?

#include <stdio.h> 

#define BACKSPACE 8 

main() 
{ 
    int c; 


    while((c = getchar()) != EOF)  //output: GODDAMN NOTHING cursor on: 'h' 
    { 
     //if the input is "house" before entering EOF 
     putchar(c);     //output: 'h' cursor on: 'o' 

     getchar();     //output: 'h' cursor on: 'u' 
     printf("%c", BACKSPACE);  //output: 'h' cursor on: 'o' 
     getchar();     //output: 'h' cursor on: 'u' 
     printf("%c", BACKSPACE);  //output: 'h' cursor on: 'o' 
     getchar();     //output: 'h' cursor on: 'u' 
     printf("%c", BACKSPACE);  //output: 'h' cursor on: 'o' 
    } 
}  //ACTUAL END OUTPUT: "h" 

Я знаю, что регулярные реверс в большинстве программ выглядит следующим образом: Е («% C% C», 8, 8) ; ..взаимодействующий backspace почти просто перемещает курсор назад, не удаляя ничего, точно так же, как getchar() просто перемещает курсор вперед.

Я пытаюсь понять, почему выше пример кода это не совсем то же самое, как:

#include <stdio.h> 

main() 
{ 
    int c; 


    while((c = getchar()) != EOF)  //output: WE HAVE NOTHING cursor on: 'h' 
    { 
     //if the input is "house" before entering EOF 
     putchar(c);   //output: 'h' cursor on: 'o' 
    } 
}  //ACTUAL END OUTPUT: "house" 

EDIT: следить за вопрос! Как мне «отменить» вызов getchar()?

#include <stdio.h> 

main() 
{ 
    int c; 
    char a; 


    while((c = getchar()) != EOF) 
    { 
     a = c; 
     putchar(c); 

     a = getchar(); 
     ?????????? 
    } 
} 

что я должен поставить на «??????????», так что, когда я GetChar снова позвонить назначить с, он получает символ после предыдущего присвоения с, а не символ после a.

ответ

2

Ваша программа на самом деле не читает с терминала по одному символу за раз. Вместо этого он считывает из буфера, который содержит всю введенную строку.

Итак:

  • после прочтения h, программа
    • отпечатки h,
    • читает o из буфера, и
    • посылает забой (кладя курсор на h)
  • затем читает u и
    • посылает забой (пытается переместить курсор перед левым краем),
  • Затем он считывает s и
    • посылает другой забой
  • завершает цикл и переходит на большее количество символов

Некоторые терминалы вернут курсор обратно в конец предыдущей строки, а некоторые остановятся на полях.

2

Ваш выход фактически не подходит к тому же месту, откуда поступает ваш вход.

Терминал собирает ваши нажатия клавиш. Когда вы печатаете, он отображает их и запоминает их. Когда вы нажмете ENTER, он отправит нажатия клавиш, которые он запомнил вашей программе.

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

, чтобы отменить одного GetChar(), вы можете использовать ungetc:

http://www.cplusplus.com/reference/cstdio/ungetc/

 Смежные вопросы

  • Нет связанных вопросов^_^