5

我的 C 代码:

int c;
c = getchar();

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

为什么这个程序在输入时会有这样的反应hello

hello
hello

不喜欢:

hheelloo
4

6 回答 6

5

您的输入是否hello正确h e l l o

因此,您提供的输入将被缓冲,直到您按下enter

于 2011-06-21T14:17:53.463 回答
5

当您键入时,控制台会抓取键盘的输出,并将其回显给您。

getchar()对输入流进行操作,该输入流通常配置为打开“规范输入”。这种配置减少了 CPU 轮询输入以获取缓冲方案的时间,在该方案中输入被缓冲,直到某些事件发生,通知缓冲区扩展。按下回车键(并按下控制 D)都倾向于刷新该缓冲区。

#include <unistd.h>

int main(void){   
    int c;   
    static struct termios oldt;
    static struct termios newt;

    /* Fetch the old io attributes */
    tcgetattr( STDIN_FILENO, &oldt);
    /* copy the attributes (to permit restoration) */
    newt = oldt;

    /* Toggle canonical mode */
    newt.c_lflag &= ~(ICANON);          

    /* apply the new attributes with canonical mode off */
    tcsetattr( STDIN_FILENO, TCSANOW, &newt);


    /* echo output */
    while((c=getchar()) != EOF) {
        putchar(c);
        fflush(STDOUT_FILENO);
    }                 

    /* restore the old io attributes */
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt);


    return 0;
}
于 2011-06-21T14:25:55.113 回答
3

当您按下回车键时,您的终端可能只会将您的输入写入标准输入。尝试输入一些内容,退格并写一些其他内容;如果您没有看到最初键入的字符,则表示您的终端在将数据发送到程序之前正在等待您编写行。

如果您想要原始终端访问(例如对按键和按键做出反应),您应该尝试一些终端库,如ncurses

于 2011-06-21T14:17:07.203 回答
1

标准输入/输出流可以被缓冲,这意味着在遇到空白字符(例如)之前,您的输入可能不会回显到屏幕上。

于 2011-06-21T14:15:54.687 回答
1

因为stdin它引用键盘时的默认值是行缓冲。
这意味着您只能看到整行,而不是单个字符。

想象一下,你问你的一个朋友他的电话号码是什么……但他必须把它写在一张纸上。当他写下这些数字时,您不会逐个数字地得到数字:当他给您一张纸时,您会得到所有数字:)

于 2011-06-21T14:23:31.893 回答
0

getchar 从输入流中读取输入,只有在按下 ENTER 键后才可用。到那时你只看到来自控制台的回显结果要达到你想要的结果,你可以使用这样的东西

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int getCHAR( ) {
    struct termios oldt,
                 newt;
    int            ch;
    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    putchar(ch);
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    return ch;
}
void main() {
    int c;
    c = getCHAR();
    while (c != 'b') {
        putchar(c);
        c = getCHAR();
    }
}
于 2011-06-21T14:31:52.563 回答