在Visual Studio 2012中使用sscanf_s获取错误

时间:2015-07-24 06:36:28

标签: c visual-studio-2012 input scanf

我正在尝试解析以下字符串 - "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预处理程序一起使用时,上述代码可以正常运行。

我想获得x1x2x3y1y2y3的值。我在这里缺少什么?

2 个答案:

答案 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() ,但cs[转换说明符适用于一对参数(除非指定抑制由a指示   *)即可。这些参数中的第一个与fscanf()相同。该参数紧接在参数列表中由第二个参数跟随,该参数具有类型rsize_t并且给出该对的第一个参数指向的数组中的元素数。 [...]

现在,进入sscanf_s()的范围,章节§K.3.5.3.7

  

sscanf_s函数等效于fscanf_s,但输入是从字符串(由参数s指定)而不是从流中获取的。 [...]

希望上面的文字足以指出错误,你错过了格式字符串中出现的[所需的第二个参数。您需要提供ignore_data的大小,rsize_t类型。