迭代 char* 字符串的正确方法是什么?获取 "corrupt" 个值
What is a properly way to iterate a char* string? Getting "corrupt" values
当我尝试迭代一个数字(使用 bitset 库转换为二进制)时,我管理了这个解决方案
#include <iostream>
#include <bitset>
void iterateBinary(int num) {
char *numInBinary = const_cast<char*>(std::bitset<32>(num).to_string().c_str());
for (int i = 31; i >= 0; i--) {
char bit = numInBinary[i];
std::cout << i << ": " << bit << std::endl;
}
}
但是在输出中发现了那些奇怪的字符
我已经通过 for (char bit : numInBinary)
而没有 c_str()
转换实现了我最初想法的解决方案,但我仍然很好奇发生了什么(也许是内存问题?)或者哪个更好迭代 char*
字符串
的方法
另请注意,输出中的“损坏”值在每次弹出时都不相同,并且只出现在最后,为什么?
提前致谢
由 to_string()
编辑的字符串 return 的生命周期,以及由 c_str()
编辑的指针 return 指向的字符串的生命周期,在完整表达式的末尾结束.
这意味着在行
之后
char *numInBinary = const_cast<char*>(std::bitset<32>(num).to_string().c_str());
指针 numInBinary
将悬空,尝试通过它访问将导致未定义的行为。
您需要存储 to_string()
中的 return 值,以便它能存在足够长的时间,例如
auto numInBinary = std::bitset<32>(num).to_string();
也不需要 char*
指针,因为 std::string
可以直接索引。
此外,如果您认为需要在任何地方使用 const_cast
,请重新考虑一下。除了您通过不寻常的方式处理 const 正确性的非常特殊的情况外,const_cast
几乎肯定是错误的方法,并且可能会导致未定义的行为。
当我尝试迭代一个数字(使用 bitset 库转换为二进制)时,我管理了这个解决方案
#include <iostream>
#include <bitset>
void iterateBinary(int num) {
char *numInBinary = const_cast<char*>(std::bitset<32>(num).to_string().c_str());
for (int i = 31; i >= 0; i--) {
char bit = numInBinary[i];
std::cout << i << ": " << bit << std::endl;
}
}
但是在输出中发现了那些奇怪的字符
我已经通过 for (char bit : numInBinary)
而没有 c_str()
转换实现了我最初想法的解决方案,但我仍然很好奇发生了什么(也许是内存问题?)或者哪个更好迭代 char*
字符串
另请注意,输出中的“损坏”值在每次弹出时都不相同,并且只出现在最后,为什么? 提前致谢
由 to_string()
编辑的字符串 return 的生命周期,以及由 c_str()
编辑的指针 return 指向的字符串的生命周期,在完整表达式的末尾结束.
这意味着在行
之后char *numInBinary = const_cast<char*>(std::bitset<32>(num).to_string().c_str());
指针 numInBinary
将悬空,尝试通过它访问将导致未定义的行为。
您需要存储 to_string()
中的 return 值,以便它能存在足够长的时间,例如
auto numInBinary = std::bitset<32>(num).to_string();
也不需要 char*
指针,因为 std::string
可以直接索引。
此外,如果您认为需要在任何地方使用 const_cast
,请重新考虑一下。除了您通过不寻常的方式处理 const 正确性的非常特殊的情况外,const_cast
几乎肯定是错误的方法,并且可能会导致未定义的行为。