将char转换为std::string不起作用
Convert char to std::string not working
我试图列出我的Pc的逻辑驱动器,并将结果添加到向量中,但我得到了这个奇怪的result = ;;;
。
我在这里错过了什么?
std::vector<std::string> directory::getLogicalDrives() {
DWORD mydrives = 100;
char lpBuffer[100];
DWORD drives = GetLogicalDriveStrings(mydrives, lpBuffer);
std::vector<std::string> driveList;
for (int i = 0; i < 100; i++) {
std::string drive(3, '%c' + lpBuffer[0]); // Missing something?
driveList.push_back(drive);
}
return driveList;
}
如文档中所述,GetLogicalDriveStrings()
为您提供了一个以NULL结尾的字符串列表,该列表以NULL字符结尾。所以只需重复该列表,例如:
std::vector<std::string> directory::getLogicalDrives() {
std::vector<std::string> driveList;
char szBuffer[105];
DWORD size = GetLogicalDriveStrings(104, szBuffer);
if ((size > 0) && (size <= 104)) {
const char *pstr = szBuffer;
while( *pstr ) {
std::string drive( pstr );
driveList.push_back(drive);
pstr += (drive.length() + 1);
}
}
return driveList;
}
DWORD mydrives = 100; char lpBuffer[100];
100个字符不够。从技术上讲,一台计算机最多可以有26个驱动器号(实际上,没有人一次有那么多驱动器号,但你仍然应该做好准备)。一个100个字符的缓冲区有足够的空间来接收最多24个驱动器号字符串(4 * 24 + 1 = 97
、4 * 25 + 1 = 101
)。缓冲区中至少需要105个字符的空间才能接收26个驱动器号字符串(4 * 26 + 1 = 105
)。
std::string drive(3, '%c' + lpBuffer[0]); // Missing something?
这一行并没有达到你认为的效果。您正在考虑C样式的sprint()
函数。不能像这样将格式字符串与std::string
一起使用。这一行甚至不应该编译,或者应该在编译时发出警告。
此外,您甚至没有正确地循环输出字符串。GetLogicalDriveStrings()
以<drive>:<nul>
格式返回字符串的双端列表,其中<drive>
是列表末尾的<nul>
。例如,如果返回驱动器A、B和C,缓冲区的内容将如下所示:
lpBuffer[ 0] = 'A';
lpBuffer[ 1] = ':';
lpBuffer[ 2] = '';
lpBuffer[ 3] = ' ';
lpBuffer[ 4] = 'B';
lpBuffer[ 5] = ':';
lpBuffer[ 6] = '';
lpBuffer[ 7] = ' ';
lpBuffer[ 8] = 'C';
lpBuffer[ 9] = ':';
lpBuffer[10] = '';
lpBuffer[11] = ' ';
lpBuffer[12] = ' ';
正确的方法是以4个字符为一组在缓冲区中循环,直到到达最后一个null终止符(不要忘记错误检查!),例如:
DWORD drives = GetLogicalDriveStrings(mydrives, lpBuffer);
if ((drives > 0) && (drives <= mydrives)) {
char *pdrive = lpBuffer;
while (*pdrive) {
std::string drive(pdrive);
driveList.push_back(drive);
pdrive += 4;
}
}
或者:
DWORD drives = GetLogicalDriveStrings(mydrives, lpBuffer);
if ((drives > 0) && (drives <= mydrives)) {
for (int i = 0; i < drives; i += 4) {
std::string drive(&lpBuffer[i]);
driveList.push_back(drive);
}
}
也就是说,考虑使用GetLogicalDrives()
,这样你就不必担心为任何驱动器号字符串分配内存或循环使用:
DWORD drives = GetLogicalDrives();
if (drives) {
char drive[] = "?:\";
for (int i = 0; i < 26; i++) {
if (drives & (1 << i)) {
drive[0] = 'A' + i;
driveList.push_back(drive);
}
}
}
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- std::string == 运算符在代码中不起作用
- 为什么unordered_set<string::iterator>不起作用?
- 如何通过长度从 std::vector 中删除元素<string>(擦除不起作用)
- 将char转换为std::string不起作用
- 为什么 std::list<string> 有效,但 std::list <int>不起作用
- 为什么显式运算符 std::string 不起作用
- 为什么一个简单的bimap(std::string <-> int)不起作用?
- std::string 的函数指针的类型定义不起作用
- 字符串运算符 += 有时在 string::resize() 之后不起作用
- 为什么 getline() 在 C++ 中不起作用?(调用'getline(std::ofstream&, std::string&)'没有匹配函数
- 在 C++11 中初始化 std::vector<std::string>不起作用?
- QString到std::string到const char*的转换在赋值中不起作用
- std::地图.使用c-string进行计数不起作用
- 为什么我的读取矢量<矢量>的循环<string>不起作用?Linux C++
- 从 std::string 到类的隐式转换不起作用
- Compare string对cin不起作用
- <string> 矢量在使用单独的类时不起作用
- 为什么在 std::string 上重载"operator <<"不起作用?
- 使用 std::string.compare() 将不起作用