gpt4 book ai didi

c - va_arg 字符串段错误

转载 作者:行者123 更新时间:2023-12-01 16:10:29 25 4
gpt4 key购买 nike

我正在制作一个类似于 printf 的函数,它需要接受一个字符串和参数,例如:

form("整数 %d, 字符串 %s", 54, "STRING");

并创建一个字符串“Integer 54,String STRING”。我正在使用 stdarg.h 库,因为我的函数需要根据字符串具有可变数量的参数。

问题是我遇到了段错误。我发现只有当我使用传递给 va_arg 的字符串(char*)执行 strlenstrcpy 时才会发生这种情况。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>

char* form(char *format, ...)
{
va_list ap;char sign;int br=0,lasti,memo=0;char* help;
int ints; float floats; double doubles; char chars; char* strings;
va_start(ap,format);
char* result=(char*)calloc(100,strlen(format));
strcpy(result,format);
for(int i=0; result[i] ;i++)
if(result[i]=='%')
{
switch (result[i+1])
{
case 'd': {
ints=va_arg(ap,int);
int b,save=ints,dec=1,j;char *p=result+i;
for(b=0;save;b++) {save/=10;dec*=10;}
for(dec/=10,j=0; dec ; j++) { p[j]=((ints/dec)%10)+0x30; dec/=10; }
strcpy(result+i+b,format+i-memo+2);memo+=b-2;
} break;

case 'f': {
floats=va_arg(ap,double);

} break;

case 'l': {
doubles=va_arg(ap,double);

} break;

case 'c': {
chars=va_arg(ap,int);
result[i]=chars;
} break;

case 's': {
strings=va_arg(ap,char*);
strcpy(result+i+strlen(strings),format+i-memo+2);memo+=(strlen(strings)-2);
} break;

default: printf("Unknown type.\n"); break;
}
i=0;
}

return result;
}

int main()
{
char a[100];
scanf("%s",a);
char*s=form("treci %s peti",a);
printf("%s", s);

printf("\n");
free(s);
return 0;
}

strlen 或 strcpy 可能导致段错误的唯一方法是字符串不是以 null 结尾的,但我的是以 null 结尾的。那么这里出了什么问题以及如何修复它?

编辑:添加代码。

最佳答案

仅针对 %s 情况进行了测试

char* form(char *format, ...)
{
va_list ap;char sign;int br=0,lasti,memo=0;char* help;
int ints; float floats; double doubles; char chars; char* strings;
va_start(ap,format);
char* result=(char*)calloc(100,strlen(format));
// strcpy(result,format);
for(int i=0; format[i] ;i++)
{
if(format[i]=='%')
{
switch (format[i+1])
{
case 'd': {
ints=va_arg(ap,int);
int b,save=ints,dec=1,j;char *p=result+i;
for(b=0;save;b++) {save/=10;dec*=10;}
for(dec/=10,j=0; dec ; j++) { p[j]=((ints/dec)%10)+0x30; dec/=10; }
strcpy(result+i+b,format+i-memo+2);memo+=b-2;
} break;

case 'f': {
floats=va_arg(ap,double);

} break;

case 'l': {
doubles=va_arg(ap,double);

} break;

case 'c': {
chars=va_arg(ap,int);
result[i]=chars;
} break;

case 's': {
strings=va_arg(ap,char*);
strcpy(result+memo,strings);
memo+=strlen(strings);
} break;

default: printf("Unknown type.\n"); break;
}
i++;
}
else
{
result[memo++] = format[i];
}
}

return result;
}

很多问题:

  1. strcpy(result+i+strlen(strings),format+i-memo+2); 是将格式复制到结果。您需要的是将作为变量参数传递的字符串复制到结果字符串。此外 result+i+strlen(strings) 没有任何意义:你为什么这么写?
  2. 每次找到格式说明符%时都会有一个i=0:为什么?这是段错误的根本原因。每次找到 % 时循环都会重新启动,并请求一个新的变量参数,但不再检索其他变量。
  3. 您必须有 2 个不同的索引来解析输入格式字符串并索引结果字符串,因为输出字符串可能具有不同的长度。

关于c - va_arg 字符串段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35621149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com