You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串转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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:13:27