我有这个代码,我期望从用户那里读取单个字符,然后重新打印它,然后重新分配新内存以存储用户将输入的下一个字符;所有这些重复,直到用户输入' 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
,但这并没有帮助。
答案 0 :(得分:1)
输入已缓冲,在用户返回之前不会传送到您的程序。请参阅this question或this question。
您对malloc
/ realloc
的使用与此无关。
答案 1 :(得分:0)
这是因为标准输出流stdout
是行缓冲的。这意味着在输出换行符'\n'
或缓冲区已满的缓冲区被刷新之前,输出将不会出现在屏幕上。此外,您不应该投射malloc
或realloc
的结果。您还应该检查malloc
的{{1}}或calloc
的结果。
NULL
答案 2 :(得分:0)
stdin缓冲字符,直到用户按下回车键,因此它不会处理单个字符。