[英]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.