如何使用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
相关产品推荐
相关产品推荐

