2015-11-08 65 views
0

示例代码是(注释是什么我想它做的第一循环):为什么backspace在C中撤消一个单独的getchar()调用?

#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" 

我知道在大多数程序定期退格的样子: 的printf(“%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" 

编辑:跟进的问题!如何“反向”调用getchar()?

#include <stdio.h> 

main() 
{ 
    int c; 
    char a; 


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

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

什么我不得不穿上“____”,所以,当我的getchar再次调用分配给C,它前面分配到c后得到的焦炭,而不是之后的字符。

回答

2

你的程序实际上并不是每次从终端读取一个字符。相反,它是从缓冲区中读取的,该缓冲区保存了您输入的整个行。

所以:

  • 阅读h,你的程序
    • 打印h
    • 从缓冲区中读取o
    • 发送退格(把光标放在h)后
  • 然后它读取u,和
    • 发送一个退格(试图左边距之前移动光标),
  • 然后它读取s,和
    • 发送另一个退格
  • 完成循环并输入更多字符

某些终端会将光标折回到上一行的末尾,有些终端会在空白处停止。

2

您的输出实际上并不会输入您输入的相同位置。

终端收集您的按键。当你键入时,显示它们并记住它们。当你按下ENTER键时,它会将它记住的键击发送给你的程序。

同时,它显示程序的输出。您可以让终端清除您键入的字符的显示,但这不会改变您输入的字符的内存,也不会更改发送到您的程序的字符。

撤消的getchar(),您可以使用ungetc函数:

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

相关问题