有没有办法在 c++ 中获得一个带有空格的完整字符串?

Posted

技术标签:

【中文标题】有没有办法在 c++ 中获得一个带有空格的完整字符串?【英文标题】:Is there a way to get a complete string with spaces in c++? 【发布时间】:2020-05-28 17:19:18 【问题描述】:

所以,我有一段代码 (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 名有两部分被空格分隔(例如:“示例帐户”) , 那么代码只取第一部分而留下第二部分/名称....

我该如何解决?

【问题讨论】:

GetUserName 是 Windows API 函数还是您编写的函数?如果是后者,请包含函数定义。 @NathanOliver: docs.microsoft.com/en-us/windows/win32/api/winbase/… 你也可以简单地说:dir[0] = "C:\\Users\\" + str + "\\Documents\\Folder"; str = std::string(wStr.begin(), wStr.end()); 是转换 unicode 字符串的错误方法。 不要自己建立目录名,而是使用适当的 Win32 调用,例如***.com/q/9542611/1741542 【参考方案1】:

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

我很确定这就是你想要的:

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 文件夹移至其他位置的情况很多。

请改用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);

【讨论】:

除了CoTaskMemFreeCComHeapPtr&lt;WCHAR&gt; 也是一个选项,提供卓越的异常安全性。

以上是关于有没有办法在 c++ 中获得一个带有空格的完整字符串?的主要内容,如果未能解决你的问题,请参考以下文章

C ++:带有空格的cin到没有getline函数的字符串

C++ 中的 DLL 导出调用,带有“::”字符串名称

flask-restless 使用分页或获得完整响应

有没有一种简单的方法可以将由空格字符分隔的一行输入拆分为 C++ 中的整数?

有没有更简单的方法来过滤非字母字符? C++

有没有办法读取 C++ 中连续特定行上的数字?