首页 > 解决方案 > 有没有办法在 C++ 中获得一个带有空格的完整字符串?

问题描述

所以,我有一段代码(c++)获取用户名(在windows中),并使用检索到的字符串,代码创建相应的目录......

BOOL DirectoryExists(const char* dirName) {

    TCHAR nameu[UNLEN + 1];
    DWORD size = UNLEN + 1;
    if (GetUserName((TCHAR*)nameu, &size))
    {
        TCHAR* t = nameu;
        wcout << t;
        //_getch();
        std::string str;
        std::wstring wStr = t;
        str = std::string(wStr.begin(), wStr.end());
        usr = str;

        dir[0] = (std::string("C:\\Users\\") + str + "\\Documents\\Folder").c_str();
    }

    DWORD attribs = ::GetFileAttributesA(dirName);
    if (attribs == INVALID_FILE_ATTRIBUTES) {
        return false;
    }
    return (attribs & FILE_ATTRIBUTE_DIRECTORY);
}

在这里,GetUserName()函数获取用户名,如果用户名只是一个直字符串,则这段代码可以正常工作,但如果 usr 名有两部分由空格分隔(例如:“example account”),那么代码只需要第一部分并留下第二部分/名称....

我该如何解决?

标签: c++stringwindowschar

解决方案


你有很多多余的和不必要的字符串副本。

我很确定这是你想要的:

wchar_t nameu[UNLEN + 1];
DWORD size = UNLEN + 1;
if (GetUserNameW(nameu, &size))
{
    dir[0] = L"C:\\Users\\" + std::wstring(nameu) + L"\\Documents\\Folder";
}

理想情况下dir[0]是类型wstring,不是string。在处理 Windows API 时,您真的应该在任何地方都使用 unicode。这将正确支持名称中包含 unicode 字符的用户。

否则,如果 dir[0] 是一个字符串,那么:

char nameu[UNLEN + 1];
DWORD size = UNLEN + 1;
if (GetUserNameA(nameu, &size))
{
    dir[0] = "C:\\Users\\" + std::string(nameu) + "\\Documents\\Folder";
}

Documents最后,在假定的用户配置文件路径末尾进行硬编码也是获取用户默认 Documents 文件夹的错误方法。在很多情况下,用户将他们的 Documents 文件夹移动到别处。

请改用SHGetKnownFolderPath。毕竟,这可能是您真正需要的。只需调用SHGetKnownFolderPath(FOLDERID_Documents)然后将“文件夹”附加到它的末尾。

所以这就是你真正想要的:

wchar_t* path=nullptr;
SHGetKnownFolderPathW(FOLDERID_Documents, KF_FLAG_DEFAULT, nullptr, &path);
dir[0] = std::wstring(path) + L"\\Folder";
CoTaskMemFree(path);

或非 unicode:

char* path=nullptr;
SHGetKnownFolderPathA(FOLDERID_Documents, KF_FLAG_DEFAULT, nullptr, &path);
dir[0] = std::string(path) + "\\Folder";
CoTaskMemFree(path);

推荐阅读