char *ReplaceString(char *str, char *s1, char *s2) { /********* Begin *********/ int a = strlen(s1); int b = strlen(s2); int c = strlen(str); char * p; string q, r, result; r = string(s2); p = strtok(str, s1); q = string(p); result = string(p); while (p != NULL) { strcat(result, r); p = strtok(NULL, s1); q = string(p); strcat(result, q); } return result; /********* End *********/ }
时间: 2023-07-06 17:39:37 浏览: 89
修改后的代码如下所示,加上了返回语句,可以正确返回替换后的新字符串:
```
char *ReplaceString(char *str, char *s1, char *s2) {
int a = strlen(s1);
int b = strlen(s2);
int c = strlen(str);
char * p;
string q, r, result;
r = string(s2);
p = strtok(str, s1);
q = string(p);
result = string(p);
while (p != NULL)
{
strcat(result, r);
p = strtok(NULL, s1);
q = string(p);
strcat(result, q);
}
return strdup(result.c_str()); // strdup()函数可以将string类型转换成char*类型,同时需要注意result变量在函数执行完毕后会被释放,需要用strdup()函数将它的内容复制到新的内存空间中返回
}
```
相关问题
#include <iostream> #include <cstring> using namespace std; char *ReplaceString(char *str, char *s1, char *s2); int main() { char str[100], s1[10], s2[10]; cin >> str >> s1 >> s2; char *result = ReplaceString(str, s1, s2); cout << result << endl; return 0 ; } char *ReplaceString(char *str, char *s1, char *s2) { /********* Begin *********/ char *a,*b,*c; a=str; b=s1; c=s2; while(*str) { } /********* End *********/ }接下来怎么编写
char *ReplaceString(char *str, char *s1, char *s2) {
char *result = new char[strlen(str) + 1]; // 分配新的字符串空间
int s1Len = strlen(s1);
int s2Len = strlen(s2);
int i = 0;
while (*str) {
if (strncmp(str, s1, s1Len) == 0) { // 如果找到了s1
strncpy(result + i, s2, s2Len); // 将s2复制到新字符串中
i += s2Len; // 更新新字符串的下标
str += s1Len; // 更新原字符串的下标
} else { // 如果没找到s1
result[i++] = *str++; // 直接复制原字符串中的字符到新字符串中
}
}
result[i] = '\0'; // 在新字符串末尾添加'\0',表示字符串结束
return result;
}
在这个函数中,我们首先分配了新的字符串空间,然后逐个字符地遍历原字符串。如果找到了s1,就将s2复制到新字符串中,否则就直接复制原字符串中的字符到新字符串中。最后,在新字符串末尾添加'\0',表示字符串结束。最后,返回新字符串的指针。需要注意的是,我们在函数内部分配了新的字符串空间,因此在使用完毕后,需要手动释放该空间,以免造成内存泄漏。
#include <iostream> #include <cstring> using namespace std; char *ReplaceString(char *str, char *s1, char *s2); int main() { char str[100], s1[10], s2[10]; cin >> str >> s1 >> s2; char *result = ReplaceString(str, s1, s2); cout << result << endl; return 0 ; } char *ReplaceString(char *str, char *s1, char *s2) { /********* Begin *********/ char a,b,c; a=&*str; b=&*s1; c=&*s2; return a; /********* End *********/ }这段代码哪里有问题
这段代码有多处问题:
1. 在函数 ReplaceString 中,将 char 类型的变量 a、b、c 定义为指针类型,且使用了 &* 运算符,这是不正确的语法。
2. 在函数 ReplaceString 中,需要对字符串 str 中的子串 s1 进行替换,但是代码中缺少替换逻辑,只是返回了 str 的首地址。
3. 在主函数中,使用了 cin 输入字符串,如果字符串中包含空格,则只会读取到空格前的部分,而不是整个字符串,需要使用其他方式读入完整字符串。
下面是修改后的代码:
```
#include <iostream>
#include <cstring>
using namespace std;
char *ReplaceString(char *str, char *s1, char *s2);
int main() {
char str[100], s1[10], s2[10];
cin.getline(str, 100);
cin >> s1 >> s2;
char *result = ReplaceString(str, s1, s2);
cout << result << endl;
delete[] result; // 释放内存
return 0 ;
}
char *ReplaceString(char *str, char *s1, char *s2) {
char *result = new char[100]; // 新建字符串存储替换后的结果
char *p1, *p2, *p3; // p1 指向 str,p2 指向 s1,p3 指向 result
while (*str) {
if (strstr(str, s1) == str) { // 找到子串 s1
p2 = s1;
p3 = result;
while (*p2) { // 将 s2 复制到 result 中
*p3++ = *s2++;
}
str += strlen(s1); // 跳过 s1
} else { // 复制 str 中的字符到 result 中
*result++ = *str++;
}
}
*result = '\0'; // 结尾添加 \0
return result - strlen(str); // 返回 result 的首地址
}
```
修改后的代码中,使用了一个新的字符串 result 存储替换后的结果,同时使用了指针 p1、p2、p3 记录字符串的位置。在循环中,如果找到了子串 s1,则将 s2 复制到 result 中,否则将 str 中的字符复制到 result 中。最后,记得添加字符串结尾的 \0,并返回 result 的首地址,同时需要在主函数中释放 result 的内存。
阅读全文