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;

}
...

本回答被提问者采纳

C语言中用动态数组储存一个长度未知的字符串,应该怎么使用malloc和rea...
\\x0d\\x0a比如:*p初始分配10个字符空间。\\x0d\\x0a当空间不够用的时候,每次增加20个字符空间。这样会增加效率。\\x0d\\x0a\\x0d\\x0a象你这样:初始p=(char*)malloc(10);\\x0d\\x0a当判断空间不够用的时候,重分配:\\x0d\\x0ap=(char*)realloc(p,10+100*n++);\/\/n做重分配次数计数...

C语言如何定于未知长度的字符串
设置一个循环,先动态申请一个较小的空间比如10字节,然后输入字符;当输入满时另外申请一个20字节的空间,把已输入的10个字符拷贝过来,释放掉10个字节的空间。然后向20个字节的空间里接着输入字符,写满时再申请一个30字符的空间……如此反复,直到输入'\\n'时结束。先动态申请一个较大的空间,如65...

C语言中,如何利用数组输入不知道个数的若干数,
在数据结构里面,一般使用动态分配空间的方式,malloc首次分配和realloc重新分配更大空间。你可以先malloc一个比较大点的空间,比如20个int的数组空间,当输入个数超过20时,realloc一片20+10的空间,也就是一次性增大10个int的空间,再输入到30个了,就再realloc一片30+10的空间。需要一个变量存贮当前最...

...函数的用法及作用?(比如malloc,calloc,realloc等)
调用calloc函数时,calloc(n,sizeof(int))表示请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址。(int *)表示将这个地址放在指针中。到此为止,就可以用指针来对分配到的空间操作了。注意,最后一定要用free函数释放申请到的空间,否则这部分空间会一直占着。malloc、calloc、realloc...

c语言编程 在未知字符串长度下怎么输入字符串???
两种方法,定义一个尽可能大的字符串 char s[9999];scanf("%s",s);2.每次读入一个字符,使用realloc动态分配内存 char s[1];char c;scanf("%c",&s[0]);int i = 1;while(scanf("%c",&c)&&c!='\\n'){s = realloc(s,(i+1)*sizeof(s[0]));s[i++]=c;} ...

【C】动态内存管理 malloc calloc relloc free 函数详解
C语言还提供了一个函数叫 calloc,calloc函数也用来动态内存分配。原型如下:示例:调试结果如图,可以理解为calloc = malloc+(memset将开辟的空间初始化为0)。如果我们对申请的内存空间的内容要求初始化,那么可以很方便的使用calloc函数来完成任务。2.3 realloc 函数原型如下:情况1 当是情况1 的时候...

malloc,calloc,realloc的使用方法和注意事项
malloc函数接收无参数,返回一个void*类型的指针。当内存开辟成功,它会返回内存起始地址;失败时,返回NULL。这个函数主要用于创建未初始化的内存空间,使用时需确保正确处理返回值,通常通过强制类型转换来操作。在使用完动态内存后,务必记得调用free释放内存。下面是一个使用malloc的例子:接着,我们看...

c语言数组个数未知怎么处理?
2,数组元素总数未知,但最大规模已知。比如不知道数组的总个数,但是确定不会超过100个,那么就可以定义一个100个元素的数组,供存储调用。3,动态分配数组。通过malloc函数,可以动态的分配数组,然后记录下当前分配的数组元素个数,并使用该数组。当数组空间不足时,可以通过realloc函数,重新分配空间,...

关于C语言二组字符数组问题?
在C语言中定义数组char name[1][20],那么它的内存大小就指定了1行20个字符大小。不能越界赋值或访问!你对错误的代码看到的结果不能说明任何问题。你想要的是动态数组。应该用malloc和realloc函数来实现动态数组,这里有几个注意点:1、你输入的是字符串长度不定且一个字符串可能会包含空格,所以不能...

C语言怎么实现可变长度字符串
char * p = (char*)malloc(sizeof(char)*n)别忘了free C++和C#的string类型在最低层实际也是利用类似方法去做的 另外有一种 char str[SIZE_MAX]也有人喜欢用 realloc函数 只是不太推荐,主要原因是以前系统上这个函数操作会出问题,因为内存的原因 ...

相似回答