互联网上有很多查找/替换功能,但我无法找到为什么这不起作用...(我自己的解决方案) 这是我试过的
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* strrpl(char *str, char* find, char *replace)
{
int i;
char *pt = strstr(str, find), *firstStr;
firstStr = (char* )malloc(100 * sizeof(char));
// copy just until i find what i need to replace
// i tried to specify the length of firstStr just with pt - str
strncpy(firstStr, str, strlen(str) - strlen(pt));
strcat(firstStr, replace);
strcat(firstStr, pt + strlen(find));
for(i = 0; i < strlen(firstStr); i++)
str[i] = firstStr[i];
return str;
}
int main()
{
char *s, *s1, *s2;
s = (char* )malloc(100 * sizeof(char));
s1 = (char* )malloc(100 * sizeof(char));
s2 = (char* )malloc(100 * sizeof(char));
scanf("%s", s1);
scanf("%s", s2);
scanf("%s", s);
printf("%s", strrpl(s, s1, s2));
return 0;
}
汇编给了我错误&#34;分段错误&#34;但我无法确定他想要分配什么记忆,他不能。我压倒了一块记忆块?请帮忙:)
由于
答案 0 :(得分:4)
我压倒了一块记忆块?
你有:
firstStr
时潜在的缓冲区溢出。谁说结果将少于100个字符?scanf
时,潜在的缓冲区溢出。 malloc
时都会发生内存泄漏。strcpy
之前return str;
的低效实施。strstr
会返回NULL
,而您永远不会检查它。strncpy
空间不足,则NUL
可能导致字符串不NUL
的潜在问题 - 已终止。答案 1 :(得分:1)
这是当前的问题:当strstr
返回NULL
时,您的代码不会引起注意。添加以下行:
char *pt = strstr(str, find), *firstStr;
if (!pt) return str;
另一个问题是strncpy
的调用不正确:
strncpy(firstStr, str, strlen(str) - strlen(pt));
它会使firstStr
无法终止,因为str
比要复制的子字符串长。随后的电话
strcat(firstStr, replace);
将对非空终止的字符串进行操作,从而导致未定义的行为。
“霰弹枪”修复它的方法是使用calloc
代替malloc
将{0}放入firstStr
。更精确的方法是将'\0'
放在复制的子字符串的末尾。
有了这些修复程序,您的代码就会运行正常(demo)。但是,有几个问题需要解决:
strncpy
- 该函数适用于固定长度的字符串。请改用memcpy
。strcat
代替memcpy
或strcpy
- 效率低下。答案 2 :(得分:0)
您尚未检查strstr的返回值。 请尝试以下代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* strrpl(char *str, char* find, char *replace)
{
int i;
char *pt = strstr(str, find);
char *firstStr;
if(pt == NULL){
printf("cannot find string \n");
return NULL;
}
firstStr = (char* )malloc(100 * sizeof(char));
// copy just until i find what i need to replace
// i tried to specify the length of firstStr just with pt - str
strncpy(firstStr, str, strlen(str) - strlen(pt));
strcat(firstStr, replace);
strcat(firstStr, pt + strlen(find));
for(i = 0; i < strlen(firstStr); i++)
str[i] = firstStr[i];
return str;
}
int main()
{
char *s, *s1, *s2, *s3;
s = (char* )malloc(100 * sizeof(char));
s1 = (char* )malloc(100 * sizeof(char));
s2 = (char* )malloc(100 * sizeof(char));
s3 = (char* )malloc(100 * sizeof(char));
scanf("%s", s);//input string
scanf("%s", s1);//string to find
scanf("%s", s2);//string to replace
s3 = strrpl(s, s1, s2);
if(s3 != NULL)
printf("%s \n",s3);
return 0;
}