2011-05-31 115 views
2

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

#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;  
} 
+4

看看“倒楣的画家算法“关于您使用的'strcat':http://en.wikipedia.org/wiki/Schlemiel_the_Painter%27s_algorithm – 2011-05-31 17:44:17

回答

5

有一些问题与替换功能,但是,首先,有一个指针之间恒定的字符数组VS字符数组有很大的区别:

char *str = "some string"; 

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

char str[] = "some string"; 

在这种情况下str是初始化为字符串,从而允许单个字符的阵列内的变形例的阵列(尺寸大到足以容纳字符串+ \ 0的)。

回到你的替换函数。

我将从第一件事情开始,我看到哪些是您使用strstrstrcat的循环内部效率非常低。每次调用strstr时,都会从字符串的开头开始搜索第二个字符串的第一个匹配项,但是同样的问题可以在strcat中看到,它需要每次都找到空终止符。

我看到的另一个问题是,如果替换字符串(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

你的编译器允许字符串文字放入只读存储器,这可能是它与s一样。

尝试:

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

这改变s从指针到一个字符串文字与您的字符串初始化数组。