簡體   English   中英

為什么getchar像緩沖區一樣工作而不是實時工作

[英]Why does getchar work like a buffer instead of working as expected in real-time

這是我關於stackoverflow的第一個問題。 如果我沒有正確搜索,請原諒我,但我似乎沒有找到解釋。 只是嘗試從Bjourne Stroustroup的論文中舉例。 添加了一些內容,以查看在鍵入文本時重新調整數組的大小。

但這似乎不起作用! getchar()只是等到我輸入完所有字符后,才執行循環。 按照邏輯,它實際上不會進入循環,獲取角色,執行其動作然后進行迭代。 我想知道這是特定於實現的還是打算像這樣?

我在Ubuntu 14.04 LTS上使用帶有gcc 4.8.2的Codeblocks。 如果重要的話,源位於cpp文件中。

while(true)
{
    int c = getchar();
    if(c=='\n' || c==EOF)
    {
        text[i] = 0;
        break;
    }
    text[i] = c;

    if(i == maxsize-1)
    {
        maxsize = maxsize+maxsize;
        text = (char*)realloc(text,maxsize);
        if(text == 0) exit(1);
        cout << "\n Increasing array size to " << maxsize << endl;
    }

    i++;
}

輸出如下:

數組大小現在為:10請輸入一些文本:這是一些示例文本。 我本來希望在這里重新分配內存,但是顯然那不是它的工作原理!

將數組大小增加到20

將數組大小增加到40

將數組大小增加到80

將數組大小增加到160

您已經輸入:這是一些示例文本。 我本來希望在這里重新分配內存,但是顯然那不是它的工作原理!

數組大小現在為:160

這與getchar直接無關。 “問題”是底層終端,它將緩沖您的輸入。 按Enter鍵后,輸入將發送到程序。 在Linux中(如果Windows中沒有辦法,請使用Dunno),您可以通過調用以下方法解決此問題

/bin/stty raw

在終端或致電

system ("/bin/stty raw");

在您的程序中。 這將導致getchar立即將輸入字符返回給您。

不要忘記通過調用重置tty行為

/bin/stty cooked

完成時!

這是一個示例(對於Linux):

#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main() {
    system ("/bin/stty raw");
    char c = getchar();
    system ("/bin/stty cooked");
    return 0;
}

也可以看看這個SO Post: 如何避免使用任何getchar()按下回車鍵

另外,如注釋中所建議,請在此處查看: http : tcsetattr ,尤其是在tcsetattr命令上,該命令應該跨平台工作。

實際上, tcsetattr不適用於Windows(在此站點中通常稱為“跨平台”)。 但是,這個問題是針對Linux的,所以“跨平台”是一個有爭議的問題。

默認情況下,標准輸入,輸出和錯誤流設置為

  • 行緩沖(輸入)
  • 塊緩沖(輸出)
  • 行緩沖(錯誤)

你可以改變使用setbuf ,但當然不會解決問題(答案呼喚單字符輸入)。 POSIX終端I / O( termios )允許您通過系統調用來更改使用stty顯示的任何標志。 通常,您可能直接從腳本調用stty ,很少從C程序調用。

閱讀單個字符是一個常見問題,例如

您還可以使用ncurses: filter功能對於處理命令行的程序(而不是全屏應用程序)很有用。 ncurses-examples (filter.c)中有一個示例程序可以執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM