制作变量参数列表功能

时间:2012-10-23 22:04:00

标签: c

我在C中创建了一个简单的变量参数列表函数。但它不起作用。当我用一个参数调用该函数,然后在该函数内检查该参数时,该参数失去了它的值。 例如在下面的代码中,当我检查“format”的值时,它总是保持为NULL .i.e。它始终显示“格式为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;
}

3 个答案:

答案 0 :(得分:1)

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

使用变量参数需要stdarg.h并使用宏va_startva_argva_end来处理它。

变量参数处理需要知道您正在使用的每个参数的类型。这是格式字符串在printf中有用的地方。你们每个参数都有一些类型(%schar *%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);
}

答案 1 :(得分: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);
}

答案 2 :(得分: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;
}

这将返回“format is NULL”。我没有别的办法, if 你按照你的指定调用了那段代码(如果你没有,所有的赌注都是关闭的:-))