首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于带前导为零的8和9,sscanf不能正常工作。

对于带前导为零的8和9,sscanf不能正常工作。
EN

Stack Overflow用户
提问于 2022-01-12 18:13:19
回答 2查看 129关注 0票数 1

我一直试图从带前导零的字符串(例如'03')中扫描带有sscanf()的整数。

然而,它的工作很好,但只有'07‘。从'08‘开始,字符串将被读取为0。

下面将找到我的代码和输出。谢谢你的帮助!

代码语言:javascript
复制
#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;    
}

输出:

代码语言:javascript
复制
Six: 6
Seven: 7
Eight: 0
Nine: 0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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整数常数)

代码语言:javascript
复制
integer-constant:
    decimal-constant integer-suffixopt
    octal-constant integer-suffixopt
    hexadecimal-constant integer-suffixopt
票数 5
EN

Stack Overflow用户

发布于 2022-01-12 18:35:46

"08"被解释为八进制数0,后面跟着一个不能成为八进制数字一部分的字符。如果你这样做的话:

代码语言:javascript
复制
   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八进制。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70686433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档