gpt4 book ai didi

c - sscanf 说明符 %[] 和缓冲区溢出

转载 作者:太空宇宙 更新时间:2023-11-04 00:20:52 28 4
gpt4 key购买 nike

很抱歉这个“另一个”sscanf 问题,但我无法通过实验找到任何解决方案。

这是一个字符串,我想解析并提取 2 个由“:”分隔的子字符串:

char *str = "tag:R123:P1234";

这个函数完成了这个工作:

char r_value[5];
char p_value[6];
sscanf(str, "tag:%[^:]:%s", r_value, p_value);
// now r_value = "R123" and p_value = "P1234"

但现在我想确定我不会溢出我的接收缓冲区:

sscanf(str, "tag:%[^:]:%5s", r_value, p_value);
// this is good for p_value, if I give something bigger than 5 character long it
// will be truncated, if less than 5 character long, I get it also

但问题在于 %[] 格式:

sscanf(str, "tag:%4[^:]:%5s", r_value, p_value);
// this will be ok if initial r_value is 4 char or less long
// but not OK if more than 4 char long, then it will be truncated,
// but p_value will not be found...

请注意我在嵌入式系统中;我负担不起非常大的缓冲区来设置更高的溢出限制...

有办法解决我的问题吗?或者我应该对每个字符进行手动循环以手动进行解析吗?

最佳答案

使用 strtok_r 这个任务要容易得多

char  r_value[5];
char p_value[6];
char *token;
char *saveptr;

token = strtok_r(str, ":", &saveptr);
if (token == NULL)
return; /* there is no ":" in the string so handle failure properly */
token = strtok_r(NULL, ":", &saveptr);
if (token == NULL)
return; /* no more tokens found so handle failure properly */
strncpy(r_value, token, sizeof r_value);
r_value[sizeof(r_value) - 1] = '\0';
token = strtok_r(NULL, ":", &saveptr);
if (token == NULL)
return; /* no more tokens found so handle failure properly */
strncpy(p_value, token, sizeof p_value);
p_value[sizeof(p_value) - 1] = '\0';

并且您可以防止 r_valuep_value 溢出。

唯一额外的事情是你应该复制 str 因为 strtok_r 需要修改它

char *str = "tag:R123:P1234";

改成

char *str = strdup("tag:R123:P1234");

并记得在最后free(str)

关于c - sscanf 说明符 %[] 和缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27674700/

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