迭代 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 几乎肯定是错误的方法,并且可能会导致未定义的行为。