这是我关于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
答案 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,因此“跨平台”是一个没有实际意义的点。
默认情况下,标准输入,输出和错误流设置为
您可以使用setbuf
更改 ,但当然无法解决问题(答案需要单字符输入)。 POSIX终端I / O(termios)允许您通过系统调用使用stty
更改显示的任何标志。通常,您可以直接从脚本调用stty
,很少从C程序调用。
阅读单个字符是一个经常被问到的问题,例如,
您也可以使用ncurses:filter
函数对于处理命令行(而不是全屏应用程序)的程序非常有用。 ncurses-examples
(filter.c)中有一个示例程序可以执行此操作。