我正在尝试解析以下字符串 - "DATA,97,103,100,97,84,69"
。这个字符串可以有以下变种 -
"DATA,100,10,1,9,82,60"
"DATA,57,27,59,30,11,64"
"DATA,12,86,100,97,103,23"
"DATA,1,10,78,38,45,52"
"DATA,99,43,85,28,84,26"
请注意,第一个"DATA,"
永远不会更改。剩下的整数从0到200不等。下面是使用sscanf_s
函数来解析这些字符串的代码 -
char ignore_data[5];
int x1,x2,x3,y1,y2,y3;
char str[]="DATA,97,103,100,97,84,69";
sscanf_s(str,"%5[^,],%d,%d,%d,%d,%d,%d", ignore_data, &x1, &x2, &x3, &y1, &y2, &y3);
printf("str=%s, x1=%d, x2=%d, x3=%d, x1=%d, y2=%d, y3=%d",str, x1, x2, x3, y1, y2,y3);
代码不起作用并显示以下错误
My Application.exe中0x510A06E4(msvcr110d.dll)的未处理异常:0xC0000005:访问冲突写入位置0x00870000。
当sscanf()
与#define _CRT_SECURE_NO_WARNINGS
预处理程序一起使用时,上述代码可以正常运行。
我想获得x1
,x2
,x3
,y1
,y2
和y3
的值。我在这里缺少什么?
答案 0 :(得分:2)
我发现如果您能够实施以下内容,您应该能够获得所需的结果:
#include <stdio.h>
int main()
{
char ignore_data[5];
int x1, x2, x3, y1, y2, y3;
char str[] = "DATA,97,103,100,97,84,69";
sscanf_s(str, "%5[^,],%d,%d,%d,%d,%d,%d", ignore_data, sizeof(ignore_data), &x1, &x2, &x3, &y1, &y2, &y3);
printf("str=%s, x1=%d, x2=%d, x3=%d, x1=%d, y2=%d, y3=%d", str, x1, x2, x3, y1, y2, y3);
return 0;
}
对于sscanf_s
在接收字符串时,扫描数据后立即需要目标缓冲区的大小。这有助于在输入流(无论它可能是什么)与目的地之间建立一个安全端口,从而减少接收字符串时缓冲区溢出的可能性。
正如 Cremno 指出它需要sscanf_s(str, "%5[^,],%d,%d,%d,%d,%d,%d", ignore_data, (unsigned)sizeof(ignore_data), &x1, &x2, &x3, &y1, &y2, &y3);
注意sizeof(ignore data)
应返回无符号值这一事实。
答案 1 :(得分:1)
引用C11
标准,附件K,章节§K.3.5.3.2, fscanf_s()
函数,(强调我的)< / p>
fscanf_s()
函数等同于fscanf()
,但c
,s
和[
转换说明符适用于一对参数(除非指定抑制由a指示 *)即可。这些参数中的第一个与fscanf()
相同。该参数紧接在参数列表中由第二个参数跟随,该参数具有类型rsize_t
并且给出该对的第一个参数指向的数组中的元素数。 [...]
现在,进入sscanf_s()
的范围,章节§K.3.5.3.7
sscanf_s
函数等效于fscanf_s
,但输入是从字符串(由参数s
指定)而不是从流中获取的。 [...]
希望上面的文字足以指出错误,你错过了格式字符串中出现的[
所需的第二个参数。您需要提供ignore_data
的大小,rsize_t
类型。