直接在 swscanf 中使用 CString 的奇怪行为

Strange behavior using CString in swscanf directly

我对 CStringSTLset 有一个问题。
CStringSTL 一起使用看起来有点奇怪,但我试图好奇。
我的代码如下:

#include "stdafx.h"
#include <iostream>
#include <set>
#include <atlstr.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t line[1024] = {0};
    FILE * pFile = _wfopen(L"F:\test.txt", L"rt");

    set<CString> cstr_set;

    while (fgetws(line, 1024, pFile))
    {
        CString cstr;
        swscanf(line, L"%s\n", cstr);
        cstr_set.insert(cstr);
    }

    fclose(pFile);
    cout << "count" << cstr_set.size();
    return 0;
}

test.txt的内容是:

13245  
123  
2344  
45  

循环结束后,cstr_set只包含一个值。
它的工作原理就好像 cstr 是静态变量或常量变量。
有什么问题?

CString 是一个 Microsoft 实现,将字符数组包装到 C++ 对象中以允许更简单的处理。

但是, swscanf 是一个很好的旧 C 函数,它对 CString 是什么一无所知:它只是期望它的参数足够大以接受解码值。它永远不应该直接传递 CString。

正确的方法是:

...
#include <cstring>
...
while (fgetws(line, 1024, pFile))
{
    line[wcscspn(line, L"\n")] = 0;  // remove an optional end of line
    CString cstr(line);
    cstr_set.insert(cstr);
}
...