find-替换C中的字符串函数

时间:2014-11-28 16:25:21

标签: c string

互联网上有很多查找/替换功能,但我无法找到为什么这不起作用...(我自己的解决方案) 这是我试过的

#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;但我无法确定他想要分配什么记忆,他不能。我压倒了一块记忆块?请帮忙:)

由于

3 个答案:

答案 0 :(得分:4)

  

我压倒了一块记忆块?

你有:

  1. 分配firstStr时潜在的缓冲区溢出。谁说结果将少于100个字符?
  2. 将答案复制回输入字符串时,另一个潜在的缓冲区溢出。谁说它适合?
  3. 每次使用scanf时,潜在的缓冲区溢出。
  4. 每次拨打malloc时都会发生内存泄漏。
  5. strcpy之前return str;的低效实施。
  6. 当输入字符串不包含替换字符串时发生崩溃(正式,未定义的行为)。如果没有匹配,strstr会返回NULL,而您永远不会检查它。
  7. 如果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)。但是,有几个问题需要解决:

  • 您没有释放动态分配的任何资源 - 这会导致内存泄漏。
  • 您不计算要分配的内存量 - 如果为100个字符的字符串中的100个字符的字符串替换了5个字符的字符串,则会超出临时缓冲区。
  • 您错误地使用strncpy - 该函数适用于固定长度的字符串。请改用memcpy
  • 您使用strcat代替memcpystrcpy - 效率低下。

答案 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;
}