使用二维数组存储数字与计算式出现异常输出求助
问题分析:分割数字与运算符时出现空行的原因及修复方案
我来帮你拆解这个问题的根源,以及怎么解决它。
首先看你代码里处理运算符的逻辑,这就是空行出现的核心原因:当遇到+、-、*、/这些符号时,你先执行了一次ctr++,才把运算符存入数组,之后又执行了一次ctr++。这直接跳过了当前的数组位置,导致中间出现了一个未初始化的空元素,输出时就会显示为空行。
举个具体的流程例子,当你输入143 + 2/3 + 23时:
- 处理完
143后遇到空格,触发第一个if分支:把newString[0]设为"143",ctr变成1,j重置为0。 - 接下来遇到
+,进入else if分支:- 先执行
ctr++,ctr从1跳到2; - 把
+存入newString[2][0]; - 又执行一次
ctr++,ctr变成3。
- 先执行
- 这时候
newString[1]这个位置完全没被赋值过,局部字符数组的默认值里包含'\0',所以printf("%s")会输出一个空行。
另外你的代码还有个隐藏问题:当数字直接跟运算符时(比如2/3里的2后面的/),数字所在的元素没有设置结束符'\0',输出时可能会带出随机的垃圾字符。
修复后的代码
我调整了逻辑,解决了空行和未结束字符的问题,同时替换了不安全的gets函数:
#include <stdio.h> #include <string.h> int main() { char str1[100]; char newString[100][100]; int i, j, ctr = 0; // 用更安全的fgets替代gets,同时去掉输入末尾的换行符 fgets(str1, sizeof(str1), stdin); str1[strcspn(str1, "\n")] = '\0'; j = 0; for (i = 0; i <= strlen(str1); i++) { if (str1[i] == ' ' || str1[i] == '\0') { // 避免连续空格产生空元素 if (j > 0) { newString[ctr][j] = '\0'; ctr++; j = 0; } } else if(str1[i]=='+'||str1[i]=='-'||str1[i]=='*'||str1[i]=='/'){ // 先结束当前正在构建的数字(如果有的话) if (j > 0) { newString[ctr][j] = '\0'; ctr++; j = 0; } // 存入运算符并手动添加结束符 newString[ctr][0] = str1[i]; newString[ctr][1] = '\0'; ctr++; } else { newString[ctr][j] = str1[i]; j++; } } for (i = 0; i < ctr; i++) { printf("%s\n", newString[i]); } return 0; }
修复说明
- 替换
gets为fgets,并移除输入的换行符,避免换行干扰处理逻辑; - 遇到空格时先判断
j>0,防止连续空格生成空元素; - 处理运算符时,先检查是否有正在构建的数字,有的话先结束它,再把运算符作为独立元素存入,之后只推进一次
ctr,不会跳过数组位置; - 给运算符元素手动添加
'\0',确保输出时是合法的字符串。
测试输入143 + 2/3 + 23,输出会和你的预期完全一致:
143 + 2 / 3 + 23
内容的提问来源于stack exchange,提问作者JohnyBgood
相关产品推荐
相关产品推荐

