传递参数 1 从指针生成整数,没有对 putchar 的转换警告

Passing Argument 1 makes integer from pointer without a cast warning for putchar

我正在研究制作一个简单代码的练习,该代码的功能与使用 可变函数.

的 printf 的功能相同

此外,我希望使用 sprintf 和 putchar,而不是 printf。

代码似乎可以正常运行并给出应有的结果(即为 %c 打印一个字符,为 %d 打印一个整数)。

但是,我不断收到 putchar(cStr); 的警告消息,上面写着 Passing Argument 1 of 'putchar' makes integer from pointer without a cast

另外,我收到一个 note 上面写着 expected int but argument is of type char *.

我试图通过将 putchar(cStr); 更改为 putchar(*cStr); 来解决这个问题,但随后代码给了我一个 segment fault.

如何解决警告信息和注意事项?

#include <stdio.h>
#include <string.h>
#include <stdarg.h>

void new_printf(const char*format, ...);

int main(void)
{
    new_printf("A single character : %c An integer : %d \n", 'T', 37);
    return 0;
}

void new_printf(const char *format, ...)
{
    va_list ap;
    char ary[50];
    char *cStr;
    int iNum, i=0;
    va_start(ap, format);
    while(*format)
    { 
        if(strncmp(format, "%d",2) == 0){
            iNum = va_arg(ap, int);
            sprintf(ary, "%d", iNum);
            while(ary[i]!='[=10=]'){
                putchar(ary[i]);
                i++;
            }       
            format = format + 2;
        }
        else if(strncmp(format, "%c", 2)==0)
        {
            cStr = va_arg(ap, char*);
            putchar(cStr);
            format = format + 2;
        }
        else{
            putchar(*format);
            format++;
        }
    }
    va_end(ap);
}

正确的结果如下:

A single character : T An integer : 37

在调用 new_printf("A single character : %c An integer : %d \n", 'T', 37); 中,'T' 被传递给 %c 转换。 'T'是一个字符:是一个小整数值。它不是指针。由于历史原因,它的类型是int。这是为 %c.

传递的正确内容

else if(strncmp(format, "%c", 2)==0) 下,在 cStr = va_arg(ap, char*); 中,你告诉 va_arg 给你下一个参数,那个参数是 char *。它不是。这是一个 int.

您应该使用 va_arg 检索它作为 int 并将其分配给 int,而不是 char *,或者直接将其用作 int.

您应该使用 int x = va_arg(ap, int); putchar(x); 或简单地使用 putchar(va_arg(ap, int));