以下是功能代码
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 - 即使变量的值不同。 请告诉我如何解决这个问题。
答案 0 :(得分: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()
获取varargs之前的最后一个参数,而不是第一个参数。
答案 1 :(得分:0)
正如评论中所述,printf()
的C99原型是:
int printf(const char * restrict format, ...);
因此,如果您正在调用函数printf()
,则应该遵循其设计。假设转换说明符只是两个字符,例如%d
或%%
,我将忽略标志,字段宽度,精度和长度修饰符。
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()
和printuno()
函数都报告了为转换说明符编写的字符数。该函数返回写入的字符总数。请注意,生产代码需要允许被调用的函数失败,因此可能不会使用len += printno(value);
表示法,而是将printno()
的返回值捕获到可能的单独变量中在将其添加到总长度输出之前测试了错误。