我一直试图从带前导零的字符串(例如'03')中扫描带有sscanf()的整数。
然而,它的工作很好,但只有'07‘。从'08‘开始,字符串将被读取为0。
下面将找到我的代码和输出。谢谢你的帮助!
#include <stdio.h>
#include <stdlib.h>
int main() {
char string_six[3] = "06";
char string_seven[3] = "07";
char string_eight[3] = "08";
char string_nine[3] = "09";
int six = -1;
int seven = -1;
int eight = -1;
int nine = -1;
sscanf(string_six, "%i", &six);
sscanf(string_seven, "%i", &seven);
sscanf(string_eight, "%i", &eight);
sscanf(string_nine, "%i", &nine);
printf("Six: %i\n",six);
printf("Seven: %i\n",seven);
printf("Eight: %i\n",eight);
printf("Nine: %i\n",nine);
return 0;
}输出:
Six: 6
Seven: 7
Eight: 0
Nine: 0发布于 2022-01-12 18:16:06
您需要使用转换说明符%d而不是%i。
来自C标准(7.21.6.2 fscanf函数)
d匹配一个可选带符号的十进制整数,该整数的格式与strtol函数的主题序列的格式相同,基本参数的值为10。对应的参数应该是指向有符号整数的指针。
i匹配一个可选的有符号整数,的格式与strtol函数的主题序列的格式相同,基参数的值为0。对应的参数应该是指向有符号整数的指针。
和(7.22.1.4 strtol、strtoll、strtoul和strtoull函数)
3如果基值为零,则主题序列的预期形式是6.4.4.1中描述的整数常数的形式,可以选择在前面加上正负号,但不包括整数后缀。
最后(6.4.4.1整数常数)
integer-constant:
decimal-constant integer-suffixopt
octal-constant integer-suffixopt
hexadecimal-constant integer-suffixopt发布于 2022-01-12 18:35:46
"08"被解释为八进制数0,后面跟着一个不能成为八进制数字一部分的字符。如果你这样做的话:
int n;
char c;
sscanf("08", "%i%c", &n, &c);你应该observe n being set to 0 and c to '8'。
根据设计,%i在输入中接受十进制、八进制和十六进制数,使用与C源代码相同的语法(即,前导'0‘表示八进制,前导'0x’或'0X‘表示十六进制)。
如果您不想接受八进制或十六进制数字,则可以使用%d;“d”意味着只接受十进制数。类似地,%o只接受八进制数(但不需要'0‘前缀),而%x只接受十六进制(但'0x’或'0X‘前缀不是必需的)。没有办法让sscanf接受十进制和0x-prefix十六进制,但也不能接受0-prefix八进制。
但是,由于the *scanf functions are broken as specified and should never be used at all,您真正应该做的是使用带有第三个参数10的strtol。(请注意the part of the strtol manpage about checking for invalid input。)(没有办法让strtol接受十进制和0x-prefix十六进制,但也不能接受0-prefix八进制。)
https://stackoverflow.com/questions/70686433
复制相似问题