基于char数组的二进制加法C语言代码输出异常问题求解
代码问题修复方案
核心错误原因
- 二进制位赋值时直接存入整型数值0/1,未转为可打印的ASCII字符
'0'/'1',删除sprintf后输出乱码就是因为数组中存储的是不可见控制字符。 - 循环内的
sprintf(Snum, "%d", num)完全多余,每次执行都会用当前单个数字的字符串覆盖Snum的开头位置,最后一次循环结束后Snum直接被改写为仅包含"1"和结束符,因此最终仅输出1。 - 未主动给存储结果的字符数组补充字符串结束符
'\0',printf输出字符串时存在内存越界风险。
修改后的完整代码
#include <iostream> #include <cstdlib> #include <cstring> #include <stdio.h> int main(){ char Pbuf8[9] = {"01100000"}; char Mbuf4[10] = {"01110000"}; int num = 0; char Snum[9] = {0}; int carry = 0; for(int c = 7; c >= 0; c--){ // 字符转整型后相加 num = (Pbuf8[c] - '0') + (Mbuf4[c] - '0') + carry; // 二进制加法运算 if(num == 1){ Snum[c] = num + '0'; carry = 0; }else if(num == 2){ Snum[c] = '0'; carry = 1; }else if(num == 3){ Snum[c] = '1'; carry = 1; } } // 补充字符串结束符 Snum[8] = '\0'; // 输出结果 printf("%s", Snum); return 0; }
运行后可得到预期输出00001011。
内容的提问来源于stack exchange,提问作者JJung
相关产品推荐
相关产品推荐

