gpt4 book ai didi

c - sscanf 后输入字符串中的空字符

转载 作者:行者123 更新时间:2023-12-04 02:47:43 27 4
gpt4 key购买 nike

在下面的代码中,我想读取十六进制字符串 'a' 中的前 2 个字符,使用 sscanf 将它们转换为相应的字节值并将结果放入 'b'。不应对“a”执行任何修改。

#include <stdio.h>
#include <string.h>

int main()
{
unsigned char a[]="fa23456789abcdef"; // 0-9 a-f
unsigned char b;
unsigned int idx = 0;

for(idx = 0; idx < 16; idx++)
printf("%c", a[idx]); // raw dump 'a'

printf("\n");
sscanf(a, "%2hhx", &b); // do sscanf
printf("%d\n", b); // check that 'b' has been correctly updated

for(idx = 0; idx < 16; idx++)
printf("%c", a[idx]); // raw dump 'a'... again

return 0;
}

输出:

fa23456789abcdef
250
3456789abcdef

编译器(Code::Blocks 中的 GNU GCC):

[...]|14|warning: pointer targets in passing argument 1 of 'sscanf' differ in signedness [-Wpointer-sign]|
[...]stdio.h|348|note: expected 'const char *' but argument is of type 'unsigned char *'|
[...]|14|warning: unknown conversion type character 'h' in format [-Wformat]|
[...]|14|warning: too many arguments for format [-Wformat-extra-args]|
||=== Build finished: 0 errors, 3 warnings (0 minutes, 0 seconds) ===|

在输出中,“a”的前 3 个字符被 3 个空字符替换,原因不明。所有警告都指向 sscanf 行。此外,code::blocks 出于某种原因不喜欢 'h' 修饰符,即使 'b' 值已正确更新也是如此。

预期结果:

fa23456789abcdef
250
fa23456789abcdef

在这种情况下可以替代使用 strtol 吗?

最佳答案

您的 sscanf 不支持 hh,这意味着它正在转换为 unsigned int 并试图将其填充到 unsigned char 大小的变量,导致未定义的行为。在您的情况下,这显然意味着要覆盖 a 的一部分。修正你的警告!

如果您的 sscanf 确实 支持 hh,您会没事的,但您可能仍应更改 a 成为 char 数组而不是 unsigned char

你需要阅读你本地的 sscanf 文档来弄清楚你应该传递什么,或者只是将 b 更改为 unsigned int并使用 "%2x" 作为您的格式字符串。

关于c - sscanf 后输入字符串中的空字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18540998/

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