xdoj398使用puts和printf的不同结果

xdoj398题:
标题:字符串压缩

问题描述:有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩)。
例如,字符串

img

可压缩为

img

请设计一个程序,采用该压缩方法对字符串压缩并输出。请编写一个函数compress,采用该压缩方法对字符串src进行压缩。函数定义如下:

char *compress(char *src);

返回值:
指向压缩后的字符串数据
参数:
src:输入/输出参数,输入表示待压缩字符串,输出表示压缩后的字符串

注意:函数声明已包含在主程序中,不需要自己定义。只需要提交自定义的函数代码。

主程序如下:

#include
#include
#include
char *compress(char *src);
int main()
{
    char src[100];
    scanf("%s",src);

    char *ps = compress(src);
    
    puts(ps);
    return 0;
}

主函数输入说明:
输入第一行为源字符串src(长度小于100),该字符串只包含大小写字母。
主函数输出说明:
输出一个数据,表示压缩后的字符串。
主函数输入样例:

img

主函数输出样例:

img

我是这样写的:

char* compress(char* src)
{
    int i = 0; int i2 = 0;
    char arr2[100] = {0};
    for (i = 0; i < strlen(src) - 1; i++)
    {
        arr2[i2] = src[i];     //第一个字母
        i2++;
        if (src[i] == src[i + 1] && src[i] == src[i + 2])   //判断是否连续出现三次
        {
            int count = 1; int t = 0;
            for (t = i; t < strlen(src) - 1; t++)
            {
                if (src[t] == src[t + 1])
                {
                    count++;                         //计算共出现几次
                }
                else
                    break;
            }
            if (count >= 10)
            {
                arr2[i2] = 1 + '0';             //将出现次数写上;如果是十次或以上要这样写。(按题目要求不可能有一百次)
                i2++;
                arr2[i2] = count - 10 + '0';
            }
            else
            {
                arr2[i2] = count + '0';
            }
            i2++;
            i += (count - 1); 
        }
        else
        {
        }
    }
    arr2[i2 + 1] = '\0';
    return arr2;
}



img


为例,在输出的时候,使用dev c++什么都没输出:

img


使用vs2022输出乱码:

img

如果改成

printf(“%s”,ps);

则dev c++仍然是空白,vs输出正确

img

请问各位:为什么dev c++输出空白?vs第一次的乱码是如何产生的?我的代码怎样改能符合题目要求?
注:vs调试时看到一切都好好的(

img

arr2这个变量要定义为静态!
因为局部变量在函数返回后其空间可能被回收了
static char arr2[100]={'\0'};

压缩函数修改如下,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* compress(char* src);
int main()
{
    char src[100];
    scanf("%s", src);

    char* ps = compress(src);

    puts(ps);
    return 0;
}
char* compress(char* src) {
    char arr2[100];
    int i, j = 0, s = 1;
    for (i = 0; i < strlen(src);) {
        s = 1;
        while (*(src + i) == *(src + i + s))
            s++;
        if (s >= 10)
            arr2[j++] = *(src + i), arr2[j++] = s / 10 + '0', arr2[j++] = s % 10 + '0';
        else if (s >= 3)
            arr2[j++] = *(src + i), arr2[j++] = s + '0';
        else
            arr2[j++] = *(src + i);
        if (s >= 3)
            i += s;
        else
            i++;
    }
    arr2[j] = '\0';
    strcpy(src, arr2);
    return src;
}