0

以下是功能代码

void printf(char *ch,void *num,...)
         {
    int i;
    va_list ptr;    //to store variable length argument list
    va_start(ptr,num); // initialise ptr


    for(i=0;ch[i]!='\0';i++)
        {


            if(ch[i]=='%')  // check for % sign in print statement
                { i++;

                    if( ch[i]=='d')
                        {  
                          int *no = (int *)va_arg(ptr,int * );
                          int value=*no;  // just used for nothing 
                          printno(value);  //print int number

                        }
                    if( ch[i]=='u')
                        {

                           unsigned long *no =(unsigned long *) va_arg(ptr,unsigned long *);
                           unsigned long value=*no;
                           printuno(value);  //print unsigned long


                        }
                }
            else    // if not % sign then its regular character so print it
                {
                    printchar(ch[i]);
                }
        }




}

这是我的 printf() 代码以打印整数值和 uint 值

它对于参数中的字符串部分工作正常,但对于 %d %u 它显示所有变量的相同值。该值为 405067 - 即使变量的值不同。请告诉我如何解决这个问题。

4

2 回答 2

1

为什么将参数解释为指针?我很惊讶你没有崩溃。你应该只是使用

int num = va_arg(ptr,int);
printno(num);

unsigned int num = va_arg(ptr,unsigned int);
printuno(value);

(注意,,unsigned int不是unsigned long,因为那实际上是%lu

另外,摆脱num参数。这是错的。你va_list应该被初始化为

`va_start(ptr, ch);`

va_start()接受可变参数之前的最后一个参数,而不是第一个参数。

于 2012-08-17T06:44:44.020 回答
0

如评论中所述,C99 原型printf()是:

int printf(const char * restrict format, ...);

因此,如果您正在调用您的函数printf(),您可能应该遵循它的设计。我将忽略标志、字段宽度、精度和长度修饰符,假设每个转换说明符只是两个字符,例如%dor %%

int printf(const char * restrict format, ...)
{
    va_list args;
    va_start(args, format);
    char c;
    int len = 0;

    while ((c = *format++) != '\0')
    {
        if (c != '%')
        {
            putchar(c);
            len++;
        }
        else if ((c = *format++) == '%')
        {
            putchar(c);
            len++;
        }
        else if (c == 'd')
        {
            int value = va_arg(args, int);
            len += printno(value);
        }
        else if (c == 'u')
        {
            unsigned value = va_arg(args, unsigned);
            len += printuno(value);
        }
        else
        {
            /* Print unrecognized formats verbatim */
            putchar('%');
            putchar(c);
            len += 2;
        }
    }
    return len;
}

处理全套格式说明符(特别是如果您添加POSIX n$表示法以及标志、字段宽度、精度和长度修饰符)要困难得多,但这应该会让您朝着正确的方向前进。请注意,我假设printno()andprintuno()函数都报告为转换说明符写入了多少字符。该函数返回写入的字符总数。还要注意,生产代码需要允许被调用的函数失败,因此可能不会使用该len += printno(value);表示法,但会将返回值捕获printno()到一个单独的变量中,该变量可以在将其添加到总数之前进行错误测试长度输出。

于 2012-08-17T09:31:55.693 回答