C 警告:传递“sprintf”的参数 1 中的指针目标在符号上有所不同

C warning: Pointer targets in passing argument 1 of ‘sprintf’ differ in signedness

提问人:Mobi Zaman 提问时间:10/31/2022 最后编辑:Jonathan LefflerMobi Zaman 更新时间:10/31/2022 访问量:2138

问:

我有以下一段代码,用于将 的值写入缓冲区。timetemp

#include<stdio.h>

int main() {
    unsigned char temp[8];
    unsigned int time = 0x00101010;
    
    sprintf(temp, "%x", time);
}

两者都是无符号值;但是,我仍然收到以下警告:temptime

Pointer targets in passing argument 1 of ‘sprintf’ differ in signedness

有人可以解释为什么我会收到此警告以及如何删除它吗?

c printf 警告 无符号

评论

3赞 Ingo Leonhardt 10/31/2022
sprintf()期望作为第一个参数,它可以是 - 在你的情况下显然是 - 默认签名char *
0赞 Tom Karzes 10/31/2022
在处理字符串时,通常希望使用 type 而不是 .这就是所有库函数(如 )想要的。charunsigned charsprintf
0赞 Jonathan Leffler 10/31/2022
哪个是“论点 1”?它是字符串(其大小的误差幅度很小;缓冲区应该更大——至少 9 个字节长)。因此,编译器抱怨传递给 的类型。您应该考虑使用 ,而不是说更改为它会修复编译器警告。explicit 和 types 在标准 C 库中都处于劣势——即使它们都不同于 plain(但其中一个等同于 plain ),也没有支持任何函数。sprintftemptempsprintf()snprintf()unsigned charsigned charcharchar
0赞 dimich 10/31/2022
此外,即使对于 4 字节整数,8 个字符也不足以容纳十六进制字符串,没有空终止符的空间。

答:

1赞 Tenobaal 10/31/2022 #1

任一:

#include<stdio.h>

int main() {
    char temp[8];
    unsigned int time = 0x00101010;
    
    sprintf(temp, "%x", time);
}

#include<stdio.h>

int main() {
    unsigned char temp[8];
    unsigned int time = 0x00101010;
    
    sprintf((char*) &temp, "%x", time);
}

sprintf 定义为 ,因此第一个参数必须是带符号的 char 指针。sprintf(char*, const char*, ...)