gpt4 book ai didi

c - 对 sscanf 用法缺乏了解

转载 作者:太空狗 更新时间:2023-10-29 16:10:58 25 4
gpt4 key购买 nike

我想解析特定的行。所以,我写了下面的代码来测试逻辑,但我可能理解错了:

typedef struct vers
{
char tu8UVersion[5];
char tu8UCommit[32];
}tst_prg_versions;

int main(int argc, char **argv)
{
tst_prg_versions lstVer;
char buf1[32];
char buf2[32];

char str[] = "BOARD-VERS-v1.0.0-git+9abc12345a";
sscanf(str, "BOARD-VERS-v%5s-git+%s", lstVer.tu8UVersion, lstVer.tu8UCommit);
printf("vers='%s'\n", lstVer.tu8UVersion);
printf("commit='%s'\n", lstVer.tu8UCommit);

sscanf(str, "BOARD-VERS-v%5s-git+%s", buf1, buf2);
printf("vers='%s'\n", buf1);
printf("commit='%s'\n", buf2);
return 0;
}

一旦执行它返回:

vers='1.0.09abc12345a'
commit='9abc12345a'
vers='1.0.0'
commit='9abc12345a

为什么第一个版本等于 1.0.09abc12345a 而不是 1.0.0

最佳答案

第一个实际上是 1.0.0!然而,问题是 tu8UVersion 不是空终止的,因此 printf(不是 sscanf)在字段之外打印(这样做是未定义的行为,但是,正如 sjsam 所指出的) - 紧随其后的是 tu8UCommit(不一定必须即便如此,出于对齐原因,中间仍可能存在一些填充字节!)。

您最多需要打印 5 个字符(%.5s in printf 格式字符串)或留出 tu8UVersion 终止位置 0,正如评论中所建议的那样。

您的缓冲区也可能发生类似的事情。你很幸运,它们似乎已经初始化为 0(可能是因为编译为调试版本),这也不一定会发生。因此,如果运气不好,您可能已经打印了 buf1 的全部剩余部分(已被丢弃)甚至更多。

关于c - 对 sscanf 用法缺乏了解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36863532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com