2011-05-31 118 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從指針到一個字符串文字與您的字符串初始化數組。