程序正常运行本地显示触发一个断点,线上显示出错。
已知字符串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;
}
两个地方都有问题,想问一下错的原因。
第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;
}