有没有办法在 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);
【讨论】:
除了CoTaskMemFree
,CComHeapPtr<WCHAR>
也是一个选项,提供卓越的异常安全性。以上是关于有没有办法在 c++ 中获得一个带有空格的完整字符串?的主要内容,如果未能解决你的问题,请参考以下文章