【发布时间】:2014-03-23 08:15:46
【问题描述】:
我有这段代码,我希望从用户那里读取一个单个字符,然后重新打印它,然后重新分配新内存以存储用户将输入的下一个字符;所有这些重复,直到用户输入“1”字符。但是,在用户按下“return”之前,我的程序什么都不做,然后回显整个字符串。为什么会这样?
#include <stdlib.h>
#include<stdio.h>
int main()
{
char *s = (char *)malloc(sizeof(char));
int i = 1 ;
do
{
scanf(" %c",s+i-1);
printf("%c" , *(s+i-1));
i++ ;
s = (char *)realloc(s , sizeof(char)*i);
}while(*(s+i-1) != '1');
printf("\n\n %s" , s);
return 0;
}
这是我所期望的:
h // input from user
h // the output
w // input from user
w // output from user
但这就是我得到的:
what // input from user
what // output
我尝试将scanf 替换为getchar,但这无济于事。
【问题讨论】:
-
1.你为什么在
malloc上使用演员表? 2. 首先malloc合理的数量(比如 2Ks)并避免重新分配。 -
在哪个操作系统上?
-
stdin缓冲字符,直到用户按下enter键。然后它立即将整行提供给您的程序。这允许用户在提交之前编辑该行。如果您一次需要一个字符,则必须更改终端设置。 -
看来你要使用GNU readline
-
@Learner - 这取决于操作系统。 malloc 将从操作系统获得一大块内存,并且该大小将取决于操作系统以使其舒适。 realloc 可能会咬入该内存或要求 malloc 从更大的块中再次询问。因此,请 malloc 为您手头的任务提供合理的内存量并节省函数调用