字符串转8位二进制仅输出首字符的问题排查
问题分析与解决
你的核心问题是修改了原字符串的字符,导致strlen()的结果在循环中被改变:
在内部循环里,你每次执行message[r] = half,也就是把当前字符不断除以2。循环8次后,message[r]的值会变成0(任何ASCII字符除以2八次后都会归0)。而C语言中字符串是以'\0'(ASCII值为0)作为结束标记的,strlen()会从字符串起始位置一直数到第一个'\0'就停止。当第一个字符被改成0后,strlen(message)直接返回0,外层循环的条件r < strlen(message)就不成立了,自然只执行一次循环。
修复方案
1. 用临时变量保存当前字符,不修改原字符串
把要转换的字符先复制到一个临时变量里,内部循环操作这个临时变量,这样原字符串不会被改动,strlen()的结果也不会变。
2. 提前计算字符串长度(可选但推荐)
把strlen(message)的结果提前存在一个变量里,避免每次循环都调用strlen(),既提高效率,也彻底避免原字符串修改对循环次数的影响。
修复后的代码
#include <cs50.h> #include <stdio.h> #include <string.h> int main(void) { string message = get_string("Enter your message:\n"); int len = strlen(message); // 提前计算长度,存在变量里 for (int r = 0; r < len; r++) { char c = message[r]; // 用临时变量存当前字符,不修改原字符串 for (int x = 0; x < 8; x++) { int remainder = c % 2; printf("%d", remainder); c = c / 2; } printf("\n"); } return 0; }
关于二进制顺序的小补充
你提到已知二进制顺序有误,这里给个简单修正思路:可以先把8位二进制数存到一个char数组里,然后反向输出。比如:
// 把内部循环替换成这段 char bits[9] = {0}; // 留一个位置存结束符 char c = message[r]; for (int x = 0; x < 8; x++) { bits[7 - x] = (c % 2) + '0'; // 把位存在对应的位置 c = c / 2; } printf("%s\n", bits);
内容的提问来源于stack exchange,提问作者Sharyn
相关产品推荐
相关产品推荐

