c - 在 Visual Studio 2012 中使用 sscanf_s 时出错

标签 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);

代码不工作并显示以下错误

Unhandled exception at 0x510A06E4 (msvcr110d.dll) in My Application.exe: 0xC0000005: Access violation writing location 0x00870000.

sscanf()#define _CRT_SECURE_NO_WARNINGS 预处理器一起使用时,上述代码可以完美运行。

我想获取x1x2x3y1y2的值y3。我在这里缺少什么?

最佳答案

我发现如果您能够执行以下操作,您应该能够获得所需的结果:

#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) 应该返回一个无符号值。

关于c - 在 Visual Studio 2012 中使用 sscanf_s 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31603763/

相关文章:

c - 编写并使用一个将掩码作为参数并返回结构的函数

c - 在 C 中的 IP header 中分配 IP 地址

c - 如果我不包含标题,为什么在调用函数之前清除 EAX?

razor - 如何在 .cshtml( Razor 页面)visual studio 2012 中打开标记的可折叠区域?

c++ - 移动数组元素的功能不起作用

C++ 终端应用程序并发输入和输出

c - Makefile 没有制作所有目标

c# - 调试时,有没有办法判断一个对象是否是不同的实例?

html - 是否可以为语音输入字段定义动态语法(用 PHP 创建)?

javascript - 我如何获取由javascript输入的 Shiny 数据?