C语言中用动态数组储存一个长度未知的字符串,应该怎么使用malloc和realloc函数?
4个回答
展开全部
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
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
展开全部
这是以前我写的代码,字符串存在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;//返回实际字符串的长度
}
希望对你有帮助
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个大小的
至于你说的第三个问题 不知道你在说什么
这些都是最基本的 哎 本来我写的程序是没有这么多注释了 为了你好理解 我都加了注释 谁知道你还没看懂 真是浪费
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
char* buffer;
buffer = (char *)malloc(initialize size);
buffer = (char *)realloc(buffer, initialize size+add size);
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
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我不懂C语言,等高人来解决
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询