为什么getchar像缓冲区一样工作而不是实时按预期工作

时间:2015-07-22 11:33:48

标签: c++ ubuntu terminal getchar

这是我关于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

2 个答案:

答案 0 :(得分:1)

这与<application .... android:largeHeap="true"> 直接无关。 &#34;问题&#34;是底层终端,它将缓冲您的输入。按Enter键后,输入将发送到程序。在Linux中(如果在Windows中存在某种方式,则不知道),您可以通过调用

来解决此问题
getchar

在终端或致电

/bin/stty raw

在您的计划中。这将导致getchar立即将输入字符返回给您。

不要忘记通过调用

重置system ("/bin/stty raw"); 行为
tty

完成后!

以下是一个示例(适用于Linux):

/bin/stty cooked

另请查看此SO帖子:How to avoid press enter with any getchar()

另外,正如评论中所建议的那样,请看一下:http://linux.die.net/man/3/termios,尤其是命令#include <stdio.h> #include <stdlib.h> using namespace std; int main() { system ("/bin/stty raw"); char c = getchar(); system ("/bin/stty cooked"); return 0; } ,它应该跨平台工作。

答案 1 :(得分:1)

实际上,tcsetattr不适用于Windows(本网站通常称之为“跨平台”)。但是,这个问题被标记为Linux,因此“跨平台”是一个没有实际意义的点。

默认情况下,标准输入,输出和错误流设置为

  • 行缓冲(输入)
  • block-buffered(输出)
  • 行缓冲(错误)

您可以使用setbuf更改 ,但当然无法解决问题(答案需要单字符输入)。 POSIX终端I / O(termios)允许您通过系统调用使用stty更改显示的任何标志。通常,您可以直接从脚本调用stty,很少从C程序调用。

阅读单个字符是一个经常被问到的问题,例如,

您也可以使用ncurses:filter函数对于处理命令行(而不是全屏应用程序)的程序非常有用。 ncurses-examples(filter.c)中有一个示例程序可以执行此操作。