C++中十六进制字符转二进制实现问题:循环异常与数组疑问
解决字符串循环终止问题与二进制结果存储方案
首先来说你遇到的循环无法终止的问题:C语言风格的字符串(也就是你用char M[64]定义的这种)是靠末尾的'\0'(空字符)来标记结束的。如果你的for循环没有检查这个结束标志,比如写成了for(i=0; ;i++)这种无终止条件的形式,程序就会一直往后访问内存,直到遇到不可控的内容,自然停不下来。
你的原始代码里用while(M[i])是对的,因为当M[i]是'\0'时,它会被判定为假,循环终止。如果要换成for循环,只需要把终止条件写清楚就行:for(int i=0; M[i] != '\0'; i++),这样就能正常遍历到字符串末尾。
接下来是用for循环把二进制输出存入新数组的需求——完全可以实现,我给你写个完整的示例代码,结合你的需求来修改:
#include<iostream> using namespace std; int main() { char M[64], binary_result[512]; // 512位足够容纳64个字符的8位二进制(64*8=512) int i = 0, bin_pos = 0; // bin_pos用来跟踪二进制数组的当前存储位置 cout << "Enter M: "; cin >> M; cout << "M= " << M << endl; // 遍历输入字符串的每个字符,直到遇到结束符'\0' for(i = 0; M[i] != '\0'; i++) { char current_char = M[i]; // 把当前字符转成8位二进制(ASCII范围0-127,8位足够) // 从最高位到最低位依次提取每一位 for(int bit = 7; bit >= 0; bit--) { // 位运算提取当前位:右移bit位后和1做与运算,得到0或1,再转成字符'0'/'1' binary_result[bin_pos++] = ( (current_char >> bit) & 1 ) ? '1' : '0'; } // 可选:如果需要在每个字符的二进制之间加空格,解开下面这行注释 // binary_result[bin_pos++] = ' '; } // 给二进制数组加上结束符,这样可以直接用cout输出整个字符串 binary_result[bin_pos] = '\0'; cout << "Binary output stored in array: " << binary_result << endl; return 0; }
关键细节说明:
- 循环终止逻辑:
M[i] != '\0'确保我们只处理输入的有效字符,不会越界访问数组之外的内存,从根源上避免死循环。 - 二进制存储:用
bin_pos变量来记录二进制数组的当前写入位置,每存一位就把索引加1,最后记得给数组加上'\0',这样它就变成了一个合法的C风格字符串,方便后续输出或处理。 - 数组使用注意:你定义的
M[64]没问题,但要注意输入的字符串长度不能超过63(因为要留一个位置存'\0'),如果需要支持更长的输入,可以把数组尺寸调大一些。
内容的提问来源于stack exchange,提问作者FysaL Al-otaibi
相关产品推荐
相关产品推荐

