C语言中用动态数组储存一个长度未知的字符串,应该怎么使用malloc和realloc函数?

如题所述

char* buffer;
buffer = (char *)malloc(initialize size);
buffer = (char *)realloc(buffer, initialize size+add size);
一般做法是设定一个初始值,再设定一个追加值。
比如:*p初始分配10个字符空间。
当空间不够用的时候,每次增加20个字符空间。这样会增加效率。

象你这样:初始p = (char *)malloc(10);
当判断空间不够用的时候,重分配:
p = (char*)realloc(p, 10+100*n++); //n做重分配次数计数器,初值=1
如果再不够用,就再次调用:
p = (char*)realloc(p, 10+100*n++); //这时n=2了,n++后=3
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-19
这是以前我写的代码,字符串存在buffer指针所在的缓冲区中
int readbuffer(char **buffer)
{
char*buftemp;
int size= 20,buf_totalcount,every_count; //每次从键盘读取的长度,最后的总长度,每次实际读取的字符数
buftemp = (char*)malloc(sizeof(char)*size);//每次分配20个字符大小缓冲区
printf("Please enter the digit number :\n");
buftemp = fgets(buftemp,size,stdin);//从键盘读取字符
every_count = strlen(buftemp); //每次实际接收的数据长度
buf_totalcount = every_count;//总长度变化
*buffer = (char*)malloc(sizeof(char)*(buf_totalcount+1));//为了最后保存结束符,多分配一位
strcpy(*buffer,buftemp);
while(buftemp[every_count-1]!='\n')//输入回车键即为输入结束
{
buftemp =fgets(buftemp,size,stdin);//从键盘读取字符
every_count = strlen(buftemp); //每次实际接收的数据长度
buf_totalcount +=every_count;//总长度变化
*buffer = (char*)realloc(*buffer,sizeof(char)*(buf_totalcount+1));//重新分配缓冲区
strcpy((*buffer)+buf_totalcount-every_count,buftemp); //拷贝本次结束的字符串
}
free(buftemp);//释放
buffer[buf_totalcount-1]='\0'; //填充结束符
returnbuf_totalcount-1;//返回实际字符串的长度
}
希望对你有帮助追问

1.buftemp = fgets(buftemp,size,stdin);//从键盘读取字符
fgets函数是从文件里读取数据的,为什么你的注释是“从键盘读取数据”?
2.every_count = strlen(buftemp); //每次实际接收的数据长度
buf_totalcount = every_count;//总长度变化
这里buftemp的长度固定了为10*sizeof(char),为什么还要把这两句写得这样复杂。
为什么不能直接是every_count=10; buf_totalcount=10;?
3.没有被suftemp储存下的数据呢?

追答

stdin这个是标准输入流 即键盘输入
fgets的意思不是一定读入size个大小的字符,如果少于size个但是你输入了回车符等它也就自动返回了 所以你不能保证你每次读入的额都是size个大小的
至于你说的第三个问题 不知道你在说什么

这些都是最基本的 哎 本来我写的程序是没有这么多注释了 为了你好理解 我都加了注释 谁知道你还没看懂 真是浪费

第2个回答  推荐于2017-10-09
char* buffer;
buffer = (char *)malloc(initialize size);
buffer = (char *)realloc(buffer, initialize size+add size);追问

我是在输入的时候就用,所以根本不知道应该追加多长的内存,
比如下面这个问题:
我要用*p存“ 一个100个字符的字符串,但实际上我的malloc开始的时候分配的事10个字节。那就得追加,但是怎么追加呢?
>>>求实际的代码

追答

一般做法是设定一个初始值,再设定一个追加值。
比如:*p初始分配10个字符空间。
当空间不够用的时候,每次增加20个字符空间。这样会增加效率。

象你这样:初始p = (char *)malloc(10);
当判断空间不够用的时候,重分配:
p = (char*)realloc(p, 10+100*n++); //n做重分配次数计数器,初值=1
如果再不够用,就再次调用:
p = (char*)realloc(p, 10+100*n++); //这时n=2了,n++后=3

追问

如何判断空间是否够用呢?难道用if在加上for循环?
真心不懂诶!

追答

介个介个,靠指针自身好像不能判断,还需要你在外维护一个量值,用量值去判断。

追问

举个例子呗。这样说来有点晕

追答

你应该自己思考才对。我觉得已经很明白了。
long p_total_size;
char* q;//another q,used to save p's start address

(char *)malloc(10);
q = p;
p_total_size = 10;

....
if (p-q==p_total_size) {
p = (char*)realloc(p, 10+100*n++);

q=p;//when you call realloc, should revalue q
p+=p_total_size;
p_total_size = 10+100*n;

}
...

本回答被提问者采纳
相似回答