Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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
C 制作变量参数列表函数_C - Fatal编程技术网

C 制作变量参数列表函数

C 制作变量参数列表函数,c,C,我用C语言编写了一个简单的变量参数列表函数,但它不起作用。当我用一个参数调用该函数,然后在该函数中检查该参数时,该参数失去了它的值。 e、 在下面的代码中,当我检查“format”的值时,它总是保持空值。它总是在调试消息中显示“format is NULL.”。 请引导我,这项事业的可能性是什么 Calling the function: lcdPrintf( "Change" ); int lcdPrintf( char * format, ... ) { if ( *for

我用C语言编写了一个简单的变量参数列表函数,但它不起作用。当我用一个参数调用该函数,然后在该函数中检查该参数时,该参数失去了它的值。 e、 在下面的代码中,当我检查“format”的值时,它总是保持空值。它总是在调试消息中显示“format is 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;
}

使用
if(*format)
时,您正在测试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);
}
#包括
无效打印整数(整数计数,…)
{
va_列表ap;
int i;
va_启动(ap,计数);
对于(i=0;i
使用
if(*format)
时,您正在测试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);
}
#包括
无效打印整数(整数计数,…)
{
va_列表ap;
int i;
va_启动(ap,计数);
对于(i=0;i
我已经使用下面的代码测试了您的函数,它似乎正常工作。问题是否可能源于代码中的其他地方

#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);
}
#包括
int lcdPrintf(字符*格式,…)
{
如果(*格式){
printf(“格式不为空。\r\n”);
}
否则{
printf(“格式为空。\r\n”);
}   
返回1;
}
int main(){
lcdPrintf(“Test”);//Prints“格式不为空。”
返回(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);
}
#包括
int lcdPrintf(字符*格式,…)
{
如果(*格式){
printf(“格式不为空。\r\n”);
}
否则{
printf(“格式为空。\r\n”);
}   
返回1;
}
int main(){
lcdPrintf(“Test”);//Prints“格式不为空。”
返回(0);
}
请引导我,这项事业的可能性是什么

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;
}
您的代码包含一个错误,这使您检查格式字符串的第一个字符,在本例中为“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;
}
#包括
int lcdPrintf(字符*格式,…)
{
/*如果您想检查格式是否为空,那么测试应该是空的*/
/*如果(格式)…,而不是如果(*格式)*/
如果(*格式){
printf(“格式不为空。\r\n”);
}
否则{
printf(“格式为空。\r\n”);
}
返回0;
}
内部主(空)
{
lcdPrintf(“”);
返回0;
}
这将返回“格式为空”。如果您按照指定的方式调用该代码,我看不出其他方法(如果您没有这样做,则所有赌注都被取消:-))

请引导我,这项事业的可能性是什么

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;
}
您的代码包含一个错误,这使您检查格式字符串的第一个字符,在本例中为“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;
}
#包括
int lcdPrintf(字符*格式,…)
{
/*如果您想检查格式是否为空,那么测试应该是空的*/
/*如果(格式)…,而不是如果(*格式)*/
如果(*格式){
printf(“格式不为空。\r\n”);
}
否则{
printf(“格式为空。\r\n”);
}
返回0;
}
内部主(空)
{
lcdPrintf(“”);
返回0;
}

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

就像一个符咒;这肯定更重要。你应该检查
格式
,而不是
*格式
。无论如何,我不明白它怎么能告诉你“格式为空”。除非你用lcdPrintf(“”)来称呼它,也许吧?谢谢大家的回复。代码绝对正确。当我在瑞萨RX63N微控制器上工作时,我想,堆栈可能被填满了。或者可能已填充保存变量参数的内存。但我不确定这个变量参数到底保存在哪里。我如何检查内存是否已满!请指导我,如何追踪这个记忆问题。工作起来很有魅力;那绝对是莫言