C语言小白,大一,想知道代码错在哪里,还有调试和运行结果为什么不一样?

2401_87735217 2024-11-29 23:52:28
#include<stdio.h>
#define MAX 100
int main()
{
    char a[MAX],record[MAX];
    int cnt[MAX];
    for(int cnm=0;cnm<MAX;cnm++){
        cnt[cnm]=1;
    }
    int c=0,i=0;
    fgets(a,MAX,stdin);
    while(a[i]!='\0' &&a[i]!='\n'){
            record[c]=a[i];
        while(i+1<MAX && a[i]==a[i+1]){
            cnt[c]++;
            i++;
        }
        c++;
        i++;
    }
    for(int j=0;record[j]!='\0';j++){
        printf("%d%c",cnt[j],record[j]);
    }
    return 0;
}

//aaaa4544456hjjj

这是一个把重复字符前加上数字表示数量的代码,最后一行是一个输入方式,这个输入直接输出结尾多了什么东西,调试结果还跟运行结果不一样,求大佬救救孩子吧

...全文
133 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

你提供的代码目的是将输入字符串中的连续重复字符用数字表示其数量,并在每个重复字符前加上该数字。例如,输入 "aaaa" 应该输出 "4a"。然而,你提到在输入 "aaaa4544456hjjj" 后,输出结果不正确,并且调试结果与运行结果不一致。

让我们逐步分析代码,找出可能的问题:

初始化数组:

char a[MAX], record[MAX];
int cnt[MAX];
for(int cnm=0; cnm<MAX; cnm++){
    cnt[cnm]=1;
}

这里初始化了两个字符数组 a 和 record,以及一个整数数组 cnt。cnt 数组的每个元素被初始化为 1,表示每个字符至少出现一次。

读取输入:

int c=0, i=0;
fgets(a, MAX, stdin);
使用 fgets 读取输入字符串到 a 中。

处理重复字符:

while(a[i]!='\0' && a[i]!='\n'){
    record[c] = a[i];
    while(i+1<MAX && a[i] == a[i+1]){
        cnt[c]++;
        i++;
    }
    c++;
    i++;
}

这段代码遍历输入字符串 a,将连续重复的字符记录到 record 数组中,并统计每个字符的重复次数到 cnt 数组中。

输出结果:

for(int j=0; record[j]!='\0'; j++){
    printf("%d%c", cnt[j], record[j]);
}

这段代码遍历 record 数组,输出每个字符及其对应的重复次数。

可能的问题及解决方案
数组越界:
在 while 循环中,i 的值可能会超过 MAX,导致数组越界访问。虽然在 while 循环中有 i+1<MAX 的检查,但在 i++ 后,i 可能会超过 MAX。

字符串结尾处理:
fgets 读取的字符串包含换行符 \n,需要在处理前将其移除。

输出结尾多出的字符:
由于 record 数组未完全初始化,可能包含未定义的字符,导致输出结尾出现多余的字符。

修改后的代码

#include <stdio.h>
#define MAX 100

int main() {
    char a[MAX], record[MAX];
    int cnt[MAX];
    for (int cnm = 0; cnm < MAX; cnm++) {
        cnt[cnm] = 1;
        record[cnm] = '\0'; // 初始化record数组
    }
    int c = 0, i = 0;
    fgets(a, MAX, stdin);

    // 移除换行符
    int len = 0;
    while (a[len] != '\0') {
        if (a[len] == '\n') {
            a[len] = '\0';
            break;
        }
        len++;
    }

    while (a[i] != '\0') {
        record[c] = a[i];
        while (i + 1 < MAX && a[i] == a[i + 1]) {
            cnt[c]++;
            i++;
        }
        c++;
        i++;
    }

    for (int j = 0; record[j] != '\0'; j++) {
        printf("%d%c", cnt[j], record[j]);
    }

    return 0;
}

解释修改

初始化 record 数组:确保 record 数组中的每个元素都被初始化为 \0,避免输出未定义字符。
移除换行符:在处理字符串前,先移除 fgets 读取的换行符。
这样修改后,代码应该能正确处理输入字符串,并输出预期的结果。你可以再次测试输入 "aaaa4544456hjjj" 看看输出是否正确。

forever74 11-30
  • 打赏
  • 举报
回复 1

所以不一样的结果分别都是什么呢?

69,774

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧