当前位置:  开发笔记 > 编程语言 > 正文

变量顺序对sscanf有影响吗?

如何解决《变量顺序对sscanf有影响吗?》经验,为你挑选了1个好方法。

我面临一个与sscanf一样奇怪的问题,当我按特定顺序传递参数时,我可以正确读取所有值,如果我改变顺序,它就可以正常工作.有人可以解释为什么这种奇怪的行为?

非工作案例:

#include 
#include 
#include 

int main() {
    uint8_t oct1, oct2, oct3, oct4;

    char buf[20];
    memset(buf, 0, sizeof(buf));

    sprintf(buf,"%d.%d.%d.%d", 1, 2, 3, 4);
    printf("%s\n", buf);
    int f = sscanf(buf,"%d.%d.%d.%d", &oct1, &oct2, &oct3, &oct4);
    printf("%d.%d.%d.%d \nSuccessfully read - %d\n", oct1, oct2, oct3, oct4, f);
    return 0;
}

Output:
    1.2.3.4
    0.0.0.4
    Successfully read - 4

工作案例:

#include 
#include 
#include 

int main() {
    uint8_t oct1, oct2, oct3, oct4;

    char buf[20];
    memset(buf, 0, sizeof(buf));

    sprintf(buf,"%d.%d.%d.%d", 1, 2, 3, 4);
    printf("%s\n", buf);
    int f = sscanf(buf,"%d.%d.%d.%d", &oct4, &oct3, &oct2, &oct1);
    printf("%d.%d.%d.%d \nSuccessfully read - %d\n", oct1, oct2, oct3, oct4, f);
    return 0;
}
Output:
    1.2.3.4  
    4.3.2.1
    Successfully read - 4

P.P... 5

正确的格式说明符uint8_tSCNu8.用法应该是:

sscanf(buf,"%" SCNu8 ".%" SCNu8 ".%" SCNu8 ".%" SCNu8, &oct1, &oct2, 
                                                       &oct3, &oct4);

同样,SCNu32SCNu16用于uint32_tuint16_t分别SCNd8,SCNd16,SCNd32int8_t,int16_tint32_t分别.

请注意,使用整数类型(在C99中引入)修复的这些是可选类型.

在旁边:

sprint是危险的,因为它们无法阻止缓冲区溢出.建议使用snprintf():

snprintf(buf,sizeof buf, "%d.%d.%d.%d", 1, 2, 3, 4);

此外,memset()ing buf是不必要的,因为你要立即写入它(注意,snprintf()总是NUL终止缓冲区).



1> P.P...:

正确的格式说明符uint8_tSCNu8.用法应该是:

sscanf(buf,"%" SCNu8 ".%" SCNu8 ".%" SCNu8 ".%" SCNu8, &oct1, &oct2, 
                                                       &oct3, &oct4);

同样,SCNu32SCNu16用于uint32_tuint16_t分别SCNd8,SCNd16,SCNd32int8_t,int16_tint32_t分别.

请注意,使用整数类型(在C99中引入)修复的这些是可选类型.

在旁边:

sprint是危险的,因为它们无法阻止缓冲区溢出.建议使用snprintf():

snprintf(buf,sizeof buf, "%d.%d.%d.%d", 1, 2, 3, 4);

此外,memset()ing buf是不必要的,因为你要立即写入它(注意,snprintf()总是NUL终止缓冲区).


@kris_lazybum请注意您和答案之间的使用差异.你不能把它们放在双引号内.他们是马科斯.因此,如果引用它们,它们就不会扩展.
推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有