swscanf_s - 运行时检查错误

时间:2017-07-30 14:57:48

标签: c++ scanf

我正在尝试使用“安全”swscanf_s来解析字符串。以下控制台代码(Visual Studio 2017,从一个更大的程序中提取)编译好并且似乎解析字符串 buf 确定(rv = 4且变量填写正确),但我得到了一个函数退出后立即出现运行时错误消息。

int main()
{
    TCHAR buf[] = L"100 200 a 3.5";
    int i1, i2;
    double d;
    wchar_t c;
    int rv = swscanf_s(buf, L"%d %d %1ws %lf", &i1, &i2, &c, (unsigned)sizeof(c), &d);
    return 0;
}

信息是: 运行时检查失败#2 - 变量'c'周围的堆栈已损坏。

问题当然在于阅读广泛的字符'a',因为如果我把它拿出来一切正常,但我看不出我做错了什么。我确信这是一个简单的答案,但任何帮助都会受到赞赏。

求助:(也许删除问题?)我在格式字符串中使用%1ws因为Microsoft文档说明“指定c时通常跳过的空白字符读取。读取下一个非空白区域单字节字符,使用%1s;读取下一个非白色空格宽字符,使用%1ws。“但是,当我刚刚使用%c时,字符被读为OK(为'a',而不是''),运行时错误消失了。混乱!

1 个答案:

答案 0 :(得分:-1)

你需要传递长度,但是你改变了尺寸。

宽字符的大小为2个字节,因此(unsigned)sizeof(c)为2,但您应该以字符为单位传递长度,即1。

另外,我不确定,但我认为你还需要足够的空间来终止null(因为你正在阅读一个字符串)。