1

我在 C 中制作了一个简单的变量参数列表函数。但它不起作用。当我用一个参数调用该函数,然后在该函数中检查该参数时,该参数丢失了它的值。例如,在下面的代码中,当我检查“格式”的值时,它始终保持为 NULL。即,它始终显示“格式为 NULL”。在调试消息中。请指导我,这个原因的可能性是什么。

Calling the function:    lcdPrintf( "Change" );

int lcdPrintf( char * format, ... ) 
{
    if ( *format ) {
        printf("format is not NULL.\r\n");
    }
    else {
        printf("format is NULL.\r\n");
    }

     return -1;
}
4

3 回答 3

1

使用 时,您正在测试 format 指向的第一个字符的值if ( *format )if ( format )如果要检查指针的有效性,请使用。但是通过你写的电话,它应该无论如何都可以工作。

变量参数的使用需要stdarg.h和宏的使用va_startva_argva_end使用它。

变量参数处理需要知道你使用的每个参数的类型。这就是格式字符串在 printf 中有用的地方。你们每个人的参数都有某种类型(%s是 a char *%d是整数),它有助于va_arg宏知道它必须读取多少字节才能获得下一个参数值。

下面是一个简单的使用 va_args 的例子

#include <stdarg.h>

void printIntegers(int count, ...)
{
    va_list ap;
    int i;

    va_start(ap, count);
    for (i = 0; i < count; i++) {
        int v = va_arg(ap, int);

        printf("%d\n", v);
    }
    va_end(ap);                      
}

int main()
{
    printIntegers(2, 12, 42);
}
于 2012-10-23T22:08:03.747 回答
0

我已经使用下面的代码测试了你的函数,它似乎可以工作。问题是否可能源于代码中的其他地方?

#include <stdio.h>

int lcdPrintf( char * format, ... ) 
{
    if ( *format ) {
        printf("format is not NULL.\r\n");
    }
    else {
        printf("format is NULL.\r\n");
    }   
    return 1;
}

int main(){ 
    lcdPrintf("Test"); // Prints "format is not NULL."  
    return (0);
}
于 2012-10-23T22:09:17.933 回答
0

请指导我,这个原因的可能性是什么。

您的代码包含一个错误,这使您检查格式字符串的第一个字符,在本例中为“C”(表示“更改”)。

因此,有一种可能性:您传递的格式字符串的第一个字符为零,即它是空的。

#include <stdio.h>

int lcdPrintf( char * format, ... )
{
    /* if you want to check whether format is null, the test ought to be */
    /* if (format) ..., not if (*format) ... */

    if ( *format ) {
        printf("format is not NULL.\r\n");
    }
    else {
        printf("format is NULL.\r\n");
    }
    return 0;
}

int main(void)
{
        lcdPrintf("");
        return 0;
}

这将返回“格式为 NULL”。如果您按照指定的方式调用该代码,我看不到其他方法(如果没有,所有赌注都将关闭:-))

于 2012-10-23T22:11:20.087 回答