C中的调试字符串替换功能

时间:2011-05-31 17:39:27

标签: c debugging string

我尝试编写一个函数,在给定的字符串s中将所有字符串s1替换为s2。 但是,我不知道为什么我的程序在替换函数中的行* p = 0处停止而没有报告任何错误? @@

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


void replace(char * s, char * s1, char * s2) {
    char * p; int l=strlen(s2);
    while ((p=strstr(s,s1))) {
        *p=0;
        p+=l;
        strcat(s,s2);
        strcat(s,p);
    }
}    

int main(void) {    
    char *s=(char *)"cmd=ls+-la&abc=xyz";
    replace (s, "+", " ");    
    printf("%s", s);
    return EXIT_SUCCESS;    
}

2 个答案:

答案 0 :(得分:5)

替换函数存在一些问题,但首先,指向常量字符数组的指针与字符数组之间存在很大差异:

char *str = "some string";

str指定不可变字符数组的地址(只读),它不复制字符串,只涉及指针。任何修改该字符串的尝试都将导致未定义的行为。

char str[] = "some string";

在这种情况下,str是一个数组(大小足以容纳字符串+ \ 0),该数组被初始化为该字符串,允许修改数组中的单个字符。

返回替换功能。

我将从我看到的第一件事开始,即你在循环中使用strstrstrcat是非常低效的。每次调用strstr时,它都从字符串的开头开始,并搜索第一个出现的第二个字符串,strcat每次都需要找到null-terminator。 / p>

我看到的另一个问题是,如果替换字符串(s2)比原始字符串(s1)长,则必须移动整个字符串以适应新字符串的其他字符。如果替换字符串较短,则会出现同样的问题。

替换简单字符的基本方法可能如下所示:

while (*s)
{
    if (*s == c1)
        *s = c2;
    ++s;
}

更换字符串的一个更复杂的方法是:

/* PRECONDITION: strlen(s1) == strlen(s2) */
int l = strlen(s2);

while (*s)
{
    if (!strncmp(s, s1, l))
    {
        memcpy(s, s2, l);
        s += l;
    }
    else
        ++s;
}

答案 1 :(得分:1)

允许您的编译器将字符串文字放入只读内存中,这可能与s的内容有关。

尝试:

char s[] = "cmd=ls+-la&abc=xyz";

这会将s从指向字符串文字的指针更改为使用字符串初始化的数组。