运行成功,却显示错误。

程序正常运行本地显示触发一个断点,线上显示出错。
已知字符串str,str表示邮箱的不标准格式。 其中”.”会被记录成”dot”,”@”记录成”at”。 写一个程序将str转化成可用的邮箱格式。(可用格式中字符串中除了开头结尾所有”dot”,都会被转换,”at”只会被转化一次,开头结尾的不转化)
输入字符串str.(1<=strlen(str)<=1000)

#include 
#include 
char* solution(char m[]) {
    char* result;

    int i, p;
    int a=1;
    for (i = 1; i <=998; i++)
    {
        if (i > 1)
        {
            if (m[i] == 'd' && m[i + 1] == 'o' && m[i + 2] == 't' && i < 998 && m[i + 3] != ' ')
            {

                m[i] = '.';
                for (p = i + 1; p < 998; p++)
                    m[p] = m[p + 2];
                m[p + 1] = ' ';
                m[p + 2] = ' ';
            }
            if (m[i] == 'a' && m[i + 1] == 't' && a && m[i + 2] != ' ')
            {
                m[i] = '@';
                for (p = i + 1; p < 999; p++)
                    m[p] = m[p + 1];
                m[p + 1] = ' ';
                a--;
            }
        }
    }
    result = &m[0];

    return result;
}


int main() {
    char str[1000];
    scanf("%s", str);

    solution(str);
    return 0;
}

img

img

img

img

两个地方都有问题,想问一下错的原因。

第8行i=998时,12行开始所有的 i+2=1000,i+3=1003 这不是越界了吗?总共size才1000

if (m[i] == 'd' && m[i + 1] == 'o' && m[i + 2] == 't' && i < 998 && m[i + 3] != ' ')
改成
if ( i < 997 && m[i] == 'd' && m[i + 1] == 'o' && m[i + 2] == 't' && m[i + 3] != ' ')


if (m[i] == 'a' && m[i + 1] == 't' && a && m[i + 2] != ' ')
改为
if (i < 998 && m[i] == 'a' && m[i + 1] == 't' && a && m[i + 2] != ' ')

该回答引用ChatGPT

这段代码可能在本地正常运行但在线上出错的原因是,它使用了指针返回局部变量的地址。在 solution 函数中,它将 char* result 指向了 char m[] 的首地址,然后将 result 返回。但是,当 solution 函数退出时,m 指向的内存空间被释放了,因此 result 指向的内存空间现在是未定义的。这可能导致在某些平台上出现错误。

为了解决这个问题,可以在 main 函数中定义一个字符数组 char result[1000],并将其作为参数传递给 solution 函数。在 solution 函数中修改 result 数组,而不是修改 m 数组。这样,在 solution 函数退出时,result 数组仍然是定义的,并且可以在 main 函数中访问到。

下面是修改后的代码示例:

#include <stdio.h>
#include <stdlib.h>

void solution(char m[], char result[]) {
    int i, p;
    int a = 1;
    for (i = 1; i <= 998; i++) {
        if (i > 1) {
            if (m[i] == 'd' && m[i + 1] == 'o' && m[i + 2] == 't' && i < 998 && m[i + 3] != ' ') {
                result[i - 1] = '.';
                for (p = i + 1; p < 998; p++)
                    result[p - 1] = m[p + 1];
                result[p - 1] = ' ';
                result[p] = '\0';
            }
            if (m[i] == 'a' && m[i + 1] == 't' && a && m[i + 2] != ' ') {
                result[i - 1] = '@';
                for (p = i + 1; p < 999; p++)
                    result[p - 1] = m[p + 1];
                result[p - 1] = ' ';
                result[p] = '\0';
                a--;
            }
        }
    }
}

int main() {
    char str[1000], result[1000];
    scanf("%s", str);

    solution(str, result);
    printf("%s", result);
    return 0;
}