PVS-Studio向我发出警告:
char c;
sscanf(line, "%d", &c);
我将%d更改为%c但这会产生错误,因为“c”现在包含数字的ASCII值而不是小数,所以我回到“%d”。
那么正确的说明符是什么?有另一种解决方案吗?
答案 0 :(得分:5)
c
是char
。您要求扫描int
。 PVS-Studio正确地警告你。将c
的类型更改为int
并扫描%d
。
答案 1 :(得分:3)
您的问题有多种解决方案:
您可以指定正确的目的地类型:
char c;
if (sscanf(line, "%hhd", &c) == 1) {
/* successful conversion */
...
}
您可以使用中间变量:
char c;
int cc;
if (sscanf(line, "%d", &cc) == 1) {
/* successful conversion */
c = cc;
...
}
您可以使用不同的转换功能:
#include <stdlib.h>
...
char c;
c = atoi(line); // no error handling, return 0 if not a number
但请注意,在所有情况下,如果sscanf()
或atoi()
转换的数值超出类型char
的范围,则行为未定义。大多数当前系统只使用转换结果的低位字节,但C标准不保证它。