十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
C语言实现可变长度字符串,主要依靠realloc函数实现,主要代码如下,
为建安等地区用户提供了全套网页设计制作服务,及建安网站建设行业解决方案。主营业务为网站建设、成都网站制作、建安网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
//程序功能,判断插入字符长度len,若大于预设大小n,调整字符串数组大小,实现动态处理数组大小。
#include stdio.h
#include stdlib.h
#include string.h
int main(int argc, char *argv[])
{
char * pstr = NULL;
int n=10;//字符串初始大小
char str[100];//待插入字符串
int len=0;//待插入字符串长度
pstr = (char*)malloc(sizeof(char)*n);//申请sizeof(char)*n个大小的内存空间
if (pstr==NULL)
{
printf("内存申请出错,程序退出!\n");
exit(1);
}
memset(pstr,'\0',sizeof(char)*n);//初始化内存空间
printf("输入待插入字符串:\n");
gets(str);
len=strlen(str)+1;
printf("内存申请出错,程序退出!%d\n",len);
if(lenn)//字符串长度大于初始大小n,重新申请内存空间
pstr=(char *)realloc(pstr,sizeof(char)*len);//重新申请内存空间
strcat(pstr,str);//将插入字符串连接给pstr
puts(pstr);
if (pstr==NULL)//清理申请内存
{
free(pstr);
pstr=NULL;
}
return 0;
}
void *realloc( void *ptr, size_t size );函数将ptr指向的储存空间改变为给定的大小size。 参数size可以是任意大小,大于或小于原尺寸(需要注意的是原始数据会丢失)都可以。返回值是指向新空间的指针,如果错误发生返回NULL。
按照你现在给出的代码,
print2(3, 100, 1, 2, 3);
输出的是1 2 3加上一位不确定值
因为va_start(vl, n);这一步理论上可以得到以a开头的va_list指针,但实际上由于编译器优化,它的效果和va_start(vl, a);是相同的
这一点,你可以打印出指针地址来确定一下
从你的代码推测,你是想让print2打印出后四个参数,包括a在内
即 100 1 2 3
如果是这样 可以用另一种方式做到
print2中,不要调用va_start
而是直接 vl=a;
如下
void print2(int n, int a, ...)
{
va_list vl;
// va_start(vl, n);//使用倒数第二个有名变量
vl = a;//编译器想优化 不让。 直接强势插入
vprint(n+1, vl);
va_end(vl);
}
可以试一下是否是你需要的效果。 如果不是 再追问
在C语言中,函数中要用数组做参数,可以采用三种方式,其中后两种均可适用于变长数组参数。
1 直接以定长数组做参数,声明形式为:
ret_type func(int a[100]);
这里就是以100个元素的数组做参数的。
2 声明时不带长度,即:
ret_type func(int a[]);
3 以指针替代数组,即:
ret_type func(int *a);
2,3两种均可以用于变长数组。不过这种情况下,需要与函数约定数组长度的确定方法,比如约定规模 ,约定结束值,增加额外参数传长度,在数组元素中包含长度,或采用全局变量传长度等等。