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

使用二维数组存储数字与计算式出现异常输出求助

问题分析:分割数字与运算符时出现空行的原因及修复方案

我来帮你拆解这个问题的根源,以及怎么解决它。

首先看你代码里处理运算符的逻辑,这就是空行出现的核心原因:当遇到+、-、*、/这些符号时,你先执行了一次ctr++,才把运算符存入数组,之后又执行了一次ctr++。这直接跳过了当前的数组位置,导致中间出现了一个未初始化的空元素,输出时就会显示为空行。

举个具体的流程例子,当你输入143 + 2/3 + 23时:

  • 处理完143后遇到空格,触发第一个if分支:把newString[0]设为"143",ctr变成1,j重置为0。
  • 接下来遇到+,进入else if分支:
    1. 先执行ctr++,ctr从1跳到2;
    2. 把+存入newString[2][0];
    3. 又执行一次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;
}

修复说明

  1. 替换gets为fgets,并移除输入的换行符,避免换行干扰处理逻辑;
  2. 遇到空格时先判断j>0,防止连续空格生成空元素;
  3. 处理运算符时,先检查是否有正在构建的数字,有的话先结束它,再把运算符作为独立元素存入,之后只推进一次ctr,不会跳过数组位置;
  4. 给运算符元素手动添加'\0',确保输出时是合法的字符串。

测试输入143 + 2/3 + 23,输出会和你的预期完全一致:

143
+
2
/
3
+
23

内容的提问来源于stack exchange,提问作者JohnyBgood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:53:10