警告:格式“%c”期望类型为“int”,但参数2的类型为“char *”。

3

我想将存储在十六进制数组中的所有字符逐个打印到屏幕上,但是在第16行出现了奇怪的错误。据我所知,%c应该期望一个char而不是int。 为什么会出现这个错误? 以下是我的代码,谢谢。

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <ctype.h>
    #include <string.h>

    int main() 
    {
        char hex[8] = "cf0a441f";
        int hexCounter;
        char *currentHex;

        for(hexCounter=0; hexCounter<strlen(hex); hexCounter++)
        {
            currentHex = &hex[hexCounter];
            printf("%c",currentHex);
        }   
         return 0;
    }

1
hex 必须声明为 char hex[9],而不是 [8]。你忘记了空终止符。 - Gandaro
4个回答

8
你的意思是:
printf("%c", *currentHex);

在我看来,你可以删除currentHex的整个概念,因为它只会增加复杂性而没有任何实际效益。只需执行以下操作:

printf("%c", hex[hexCounter]);

重要的一点是你应该传递字符本身的值,而不是它的地址,这就是你正在做的事情。

因为你将 currentHex 传递给了 printf,而 currentHex 是一个指向 char 的指针。顺便说一下,这不是一个错误,而是一个警告。 - Gandaro
警告非常清楚 - %c 转换说明符期望其对应的参数为 int 类型,但是您传递了一个 char * 类型的参数。 - John Bode
仅仅因为它是一个警告并不意味着它不严重。这只是意味着代码没有违反编译器需要执行的编译时约束。在 OP 的情况下,传递错误的类型会引发 UB,这非常糟糕。 - R.. GitHub STOP HELPING ICE

2
你的 hex[hexCounter] 是一个 char 类型,所以当你设置时,要注意。
currentHex = &hex[hexCounter];

您将currentHex设置为char的地址,即char *。因此,在您的printf中,您需要

printf("%c",*currentHex);

你所做的事情是不必要的,因为你可以直接进行。
printf("%c",hex[hexCounter]);

0

这是经过修改后在我的电脑上运行良好的代码 -

#include <stdio.h>
#include <stdlib.h>

#include <limits.h>
#include <ctype.h>
#include <string.h>

int main() 
{
    char hex[9] = "cf0a441f";
    unsigned int hexCounter; 
    char *currentHex;
    for(hexCounter=0; hexCounter<strlen(hex); hexCounter++)
    {
        currentHex = &hex[hexCounter];
        printf("%c",*currentHex);
    }   
     return 0;
}

0

currentHex 应该是 char 类型,而不是 char * 类型。

 char currentHex;

 [..]

 currentHex = hex[hexCounter];
 printf("%c",currentHex);

如果你真的想让它成为一个指针,解引用它以打印:
printf("%c",*currentHex);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接