我正在尝试使用“安全”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',而不是''),运行时错误消失了。混乱!
答案 0 :(得分:-1)
你需要传递长度,但是你改变了尺寸。
宽字符的大小为2个字节,因此(unsigned)sizeof(c)
为2,但您应该以字符为单位传递长度,即1。
另外,我不确定,但我认为你还需要足够的空间来终止null(因为你正在阅读一个字符串)。