如何解决 GCC 编译 [-Wformat] 警告?
How to resolve GCC compilation [-Wformat] warning?
我正在使用 this approach 将十六进制字符串转换为字节 array.The 代码工作正常。
编译此代码时,我收到以下编译警告。有什么办法可以解决吗?
/* test.c */
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if (argc < 2)
{
printf("Usage: ./test <input hex string>\n");
return 0;
}
char *hexstring = argv[1];
printf("hextring:%s\n", hexstring);
uint8_t str_len = strlen(hexstring);
printf("length:%d\n", str_len);
uint8_t array_size = str_len / 2;
printf("array_size:%d\n", array_size);
uint8_t *input = (uint8_t *)calloc(array_size, sizeof(uint8_t));
for (int i = 0; i < array_size; i++)
{
sscanf(hexstring, "%02x", &input[i]);
hexstring = hexstring + 2;
}
for (int i = 0; i < array_size; i++)
{
printf("input[%d]:[%.2x]\n", i, input[i]);
}
return 0;
}
编译警告:
gcc test.c -o test
test.c:24:34: warning: format specifies type 'unsigned int *' but the argument has type 'uint8_t *' (aka 'unsigned char *') [-Wformat]
sscanf(hexstring, "%02x", &input[i]);
~~~~ ^~~~~~~~~
uint8_t
的大小通常小于 unsigned int
之一,因此您的代码似乎 恰好可以工作 。
您应该使用正确的格式说明符。
添加
#include <inttypes.h>
在代码的开头,将格式 "%02x"
更改为 "%02" SCNx8
。
SCNx8
宏将扩展为正确的格式说明符并连接到 "%02"
部分。
如果不幸的是您的环境不支持此功能,另一种方法是使用正确类型的缓冲区来读取值。
for (int i = 0; i < array_size; i++)
{
unsigned int buffer = 0;
sscanf(hexstring, "%02x", &buffer);
input[i] = (uint8_t)buffer;
hexstring = hexstring + 2;
}
我正在使用 this approach 将十六进制字符串转换为字节 array.The 代码工作正常。 编译此代码时,我收到以下编译警告。有什么办法可以解决吗?
/* test.c */
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if (argc < 2)
{
printf("Usage: ./test <input hex string>\n");
return 0;
}
char *hexstring = argv[1];
printf("hextring:%s\n", hexstring);
uint8_t str_len = strlen(hexstring);
printf("length:%d\n", str_len);
uint8_t array_size = str_len / 2;
printf("array_size:%d\n", array_size);
uint8_t *input = (uint8_t *)calloc(array_size, sizeof(uint8_t));
for (int i = 0; i < array_size; i++)
{
sscanf(hexstring, "%02x", &input[i]);
hexstring = hexstring + 2;
}
for (int i = 0; i < array_size; i++)
{
printf("input[%d]:[%.2x]\n", i, input[i]);
}
return 0;
}
编译警告:
gcc test.c -o test
test.c:24:34: warning: format specifies type 'unsigned int *' but the argument has type 'uint8_t *' (aka 'unsigned char *') [-Wformat]
sscanf(hexstring, "%02x", &input[i]);
~~~~ ^~~~~~~~~
uint8_t
的大小通常小于 unsigned int
之一,因此您的代码似乎 恰好可以工作 。
您应该使用正确的格式说明符。
添加
#include <inttypes.h>
在代码的开头,将格式 "%02x"
更改为 "%02" SCNx8
。
SCNx8
宏将扩展为正确的格式说明符并连接到 "%02"
部分。
如果不幸的是您的环境不支持此功能,另一种方法是使用正确类型的缓冲区来读取值。
for (int i = 0; i < array_size; i++)
{
unsigned int buffer = 0;
sscanf(hexstring, "%02x", &buffer);
input[i] = (uint8_t)buffer;
hexstring = hexstring + 2;
}