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

如何使用scanf读取二进制数字串并转换为对应的整数值?

C语言二进制字符串转整数实现方案

原有代码核心问题

  • 缓冲区溢出:unsigned char仅占1字节存储空间,%8s会写入至少9字节(8个输入字符+1个字符串结束符\0),触发未定义行为
  • 字符值与位值不匹配:输入的'0'、'1'是ASCII字符,对应数值为48、49,不是实际需要的0、1二进制位值

方案1:使用标准库函数strtoul转换

strtoul是C标准库提供的字符串转无符号长整数函数,第三个参数指定解析基数为2,即可直接按二进制规则转换字符串,自动处理前导零,实现简单可靠。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    // 预留足够空间存储8位二进制串+结束符
    char bin_str[9];
    unsigned char byte;

    // 限制最多读取8个字符,避免缓冲区溢出
    scanf("%8s", bin_str);
    // 按二进制规则解析字符串
    byte = (unsigned char)strtoul(bin_str, NULL, 2);

    printf("%d,%c", byte, byte);
    return 0;
}

方案2:手动实现转换逻辑

如果不想依赖标准库的字符串转换函数,可以手动逐位拼接数值:

#include <stdio.h>

int main()
{
    char bin_str[9];
    // 初始化结果为0
    unsigned char byte = 0;
    int i = 0;

    scanf("%8s", bin_str);
    // 遍历所有输入字符
    while (bin_str[i] != '\0') {
        // 已有位左移1位,腾出最低位空间
        byte <<= 1;
        // 当前字符转成0/1后写入最低位
        byte |= (bin_str[i] - '0');
        i++;
    }

    printf("%d,%c", byte, byte);
    return 0;
}

逻辑说明:每次左移操作等价于将已有数值乘2,叠加当前位的0/1值后,遍历完全部字符即可得到二进制串对应的整数值,例如00110011遍历后最终结果为51。


内容的提问来源于stack exchange,提问作者Bas de Wildt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:45:03