- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个类似于 printf 的函数,它需要接受一个字符串和参数,例如:
form("整数 %d, 字符串 %s", 54, "STRING");
并创建一个字符串“Integer 54,String STRING”
。我正在使用 stdarg.h 库,因为我的函数需要根据字符串具有可变数量的参数。
问题是我遇到了段错误
。我发现只有当我使用传递给 va_arg
的字符串(char*)执行 strlen
或 strcpy
时才会发生这种情况。这是我的代码:
#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;
}
很多问题:
strcpy(result+i+strlen(strings),format+i-memo+2);
是将格式复制到结果。您需要的是将作为变量参数传递的字符串复制到结果字符串。此外 result+i+strlen(strings)
没有任何意义:你为什么这么写?%
时都会有一个i=0
:为什么?这是段错误的根本原因。每次找到 %
时循环都会重新启动,并请求一个新的变量参数,但不再检索其他变量。关于c - va_arg 字符串段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35621149/
我有以下函数将传递的参数写入二进制文件。 void writeFile(FILE *fp, const int numOfChars, ...) { va_list ap; va_star
我正在制作一个类似于 printf 的函数,它需要接受一个字符串和参数,例如: form("整数 %d, 字符串 %s", 54, "STRING"); 并创建一个字符串“Integer 54,Str
为什么下面的代码给出EXC_BAD_ACCESS, could not access memory ? int combine_strings(char **outputStr,...) {
我的打印函数使用 va_arg 函数打印随机字符。我不明白为什么它不起作用。提前感谢您的帮助! #include #include #include int myprint(const char
在 main.c 中,我调用 function(2, "string", "yes") 哪里 void function(UINT16 id, const char *ptr_argDescr,
我想用这种方式编写一个带有可变参数的函数: static void configElement(U32 localFaultId, char* na
我正在研究可变函数和参数。 我注意到 va_arg 能够将对象转换为其他对象。例如,当下一个参数是 char 时,但您正在使用 va_arg 就像它应该是 int 一样,它会转换 char 到 int
我可以将类型转换为 va_arg 返回示例吗?据我所知,va_arg 无法读取返回 char/short int 类型 if (flags->size == 0) u->s = (char)v
我正在尝试编写一个带有格式字符串和一些可变数字参数的小函数。格式字符串采用表示不同数字类型的各种字符(c 表示 char,i 表示 int,d 表示 double 等),然后字符串中的每个字符采用该类
我是第一次尝试编写自己的 va_args 函数,但我遇到了一个问题,即大整数(仍在 int 范围内)被截断为 3 位数字,并且乱序! 这里是实现 void __sprintf(char * _stri
如果我调用 va_arg 的次数少于可变参数函数中传递的参数数量,是否会出现未定义的行为? 例如: #include void foo(unsigned n, ...) { va_list
全部, 我正在编写一个小型 C++ 应用程序,但一直被这个问题难倒。如果元素类型不是预期的,是否有一种方法可以在使用 va_arg 从 va_list 宏访问元素时创建(并稍后捕获)错误。例如:- c
使用以下代码,va_arg 将在第二次和第三次通过 vProcessType 时返回垃圾。 // va_list_test.cpp : Defines the entry point for the
我正在尝试创建一个函数,该函数在参数中采用可变数量的矩阵并将这些矩阵乘以第一个。我可以使用 va_arg 读取第一个,但下一次调用 va_arg 将导致访问冲突。 这是我声明方法的方式: templa
我做了一个简单的测试用例: static void va_test(char* str_arg, ...) { va_list ap; va_start(ap, str_arg); for
我想像这样用指针参数初始化一个链表: /* * Initialize a linked list using variadic arguments * Returns the number of
mystruct_t v = va_arg(a_list, mystruct_t); 就 C 规范而言,这可以吗(使用大于等于 int 大小的自定义数据类型)? 最佳答案 C 标准中没有关于将结构类型
我正在阅读一个 stdarg.h(下面的链接)头文件,它定义了 va_arg 宏,如下所示 /* * Increment ap to the next argument in the list wh
我知道如果我将像 void (*func)(void *) 这样的参数传递给可变参数函数,我可以像这样检索参数: void (*func)(void *) = va_arg( args, void (
这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the h
我是一名优秀的程序员,十分优秀!