为什么不退格撤消在C中单独的getchar()调用?

时间:2015-11-08 02:09:59

标签: c getchar backspace

示例代码是(注释是我想象的第一个循环):

#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(&#34;%c%c&#34;,8,8); ..意味着退格几乎只是将光标向后移动而不删除任何东西,就像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"

编辑:跟进问题!我如何反转&#34;一个getchar()调用?

#include <stdio.h>

main()
{
    int c;
    char a;


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

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

我需要做什么&#34; ??????????## 34;,这样当我再次调用getchar分配给c时,它会在前面的赋值之后得到char c,而不是a之后的字符。

2 个答案:

答案 0 :(得分:2)

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

所以:

  • 阅读 public function upload_photo() { $file = Input::file('camera_input'); var_dump($file); } 后,您的计划
    • 打印h
    • 从缓冲区中读取h
    • 发送退格(将光标放在o
  • 然后它会读取h,然后
    • 发送退格(试图在左边距之前移动光标),
  • 然后它会读取u,然后
    • 发送另一个退格
  • 完成循环并获取更多字符

有些终端会将光标换回上一行的末尾,有些会停在边缘。

答案 1 :(得分:2)

您的输出实际上并未转到输入来源的相同位置。

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

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

撤消 getchar(),你可以使用ungetc:

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