Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sprintf处理va_参数的C编程?_C - Fatal编程技术网

使用sprintf处理va_参数的C编程?

使用sprintf处理va_参数的C编程?,c,C,我正在尝试学习va_args是如何工作的,我想将args列表与im生成的函数中的格式字符串合并。我现在做这件事的方式只会让我感到不安。有没有一种方法可以让我避免编写大量的处理函数 va_start( listPointer, msg ); #ifdef DEBUG fprintf(stderr, msg, listPointer); #endif str = (char *)calloc(sizeof(MAX_LINE_SIZE), sizeof(char)); if(str == NULL){

我正在尝试学习va_args是如何工作的,我想将args列表与im生成的函数中的格式字符串合并。我现在做这件事的方式只会让我感到不安。有没有一种方法可以让我避免编写大量的处理函数

va_start( listPointer, msg );
#ifdef DEBUG
fprintf(stderr, msg, listPointer);
#endif
str = (char *)calloc(sizeof(MAX_LINE_SIZE), sizeof(char));
if(str == NULL){
    fprintf(stderr, "out of memory exception");
    return;
}
snprintf(str, MAX_LINE_SIZE, listPointer);
printf("testing: %s\n", str);
ret = write(logger, str, strlen(str));
if(ret == -1){
    fprintf(stderr, 
            "Could not write to file with error: %s\n", 
            strerror(errno));
    fprintf(stderr, "Cannot continue with error logging");
}
va_end( listPointer );
使用or函数。它不是采用参数列表,而是采用va_列表作为其参数

你可以称之为:

vsnprintf(str, MAX_LINE_SIZE, listPointer);
使用or函数。它不是采用参数列表,而是采用va_列表作为其参数

你可以称之为:

vsnprintf(str, MAX_LINE_SIZE, listPointer);

成对编写变量参数函数:

void ellipsis_function(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    valist_function(fmt, args);
    va_end(args);
}

void valist_function(const char *fmt, va_list args)
{
    vfprintf(stderr, fmt, args);
}
第一个函数应该与我展示的非常接近;可能有额外的固定参数,可能还有一个要捕获的返回值,但除此之外,它真的很简单


第二个函数可以根据需要执行任何操作,使用
vsnprintf()
等将数据格式化为字符串。

成对编写变量参数函数:

void ellipsis_function(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    valist_function(fmt, args);
    va_end(args);
}

void valist_function(const char *fmt, va_list args)
{
    vfprintf(stderr, fmt, args);
}
第一个函数应该与我展示的非常接近;可能有额外的固定参数,可能还有一个要捕获的返回值,但除此之外,它真的很简单


第二个函数可以根据需要执行任何操作,使用
vsnprintf()
等将数据格式化为字符串。

欢迎使用堆栈溢出。请尽快阅读这一页。如果您提供了SSCCE(),它也将帮助您永无止境。我们可以猜测(但不必猜测)您在代码之前有
void函数(const char*msg,…){va_list listPointer;
,或类似的内容。请至少提供完整的函数。您应该使用
vsnprintf()
v*printf()的其他成员之一
family,我相信。您对的调用与您认为的不一样。欢迎使用堆栈溢出。请尽快阅读该页面。如果您提供SSCCE(),它也会有帮助。我们可以猜测(但不必猜测)您有
void函数(const char*msg,…){va_list listPointer;
在您的代码或类似代码之前。请至少提供完整的函数。您应该使用
vsnprintf()
v*printf()
家族的其他成员之一,我相信。您对的调用不会起到您认为它在起的作用。