我在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;
}
答案 0 :(得分:1)
使用if ( *format )
时,您正在测试格式指向的第一个字符的值,如果要检查指针的有效性,请使用if ( format )
。但是随着你写的电话,无论如何都应该有效。
使用变量参数需要stdarg.h
并使用宏va_start
,va_arg
和va_end
来处理它。
变量参数处理需要知道您正在使用的每个参数的类型。这是格式字符串在printf中有用的地方。你们每个参数都有一些类型(%s
是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);
}
答案 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 你按照你的指定调用了那段代码(如果你没有,所有的赌注都是关闭的:-))