用于替换字符串中所有子字符串的程序

时间:2014-08-17 07:37:33

标签: c

这是一个用字符串中的给定字符串替换所有子字符串的程序。但是它显示了分段错误..帮助..

char s[1000]="i am a good boy,he  is a good boy";
char rep[100]="good";
char new[100]="bad";
char result[1000];
char *tmp;
int len;
char *k=s;

while(1) 
{
    tmp=strstr(k,rep);
    if(tmp==NULL)
        break;
    len=tmp-k;  
    tmp=tmp+strlen(rep);    
    strncpy(result,k,len);
    strcat(result,new); 
    k=k+len+strlen(rep);        
}
strcat(result,tmp);
puts(result);

3 个答案:

答案 0 :(得分:2)

您的代码使用strncpy()但不会终止字符串,然后使用strcat()附加到非终止字符串。这不是一个好主意。

您的代码总是在每次迭代时复制到result的{​​开头},丢弃在上一次迭代中复制的任何内容。这也不是一个好主意。

您的代码也会提交' clbuttic'匹配和替换部分词语的错误(所以'商品' - 如同货物列车' - 如果代码有效,将成为“坏事”。

答案 1 :(得分:1)

memcpy版本。

char *s="i am a good boy,he  is a good boy";
char *rep="good";
char *new_word="bad";
char result[1000];
char *tmp;
int r_len= strlen(rep);
int n_len= strlen(new_word);
char *k=s;
char *r=result;

while(1){
    if(NULL==(tmp=strstr(k,rep))){
        memcpy(r, k, strchr(k, '\0') - k + 1);
        break;
    }
    r = (char*)memcpy(r, k, tmp - k) + (tmp - k);
    r = (char*)memcpy(r, new_word, n_len) + n_len;
    k = tmp + r_len;
}
puts(result);

答案 2 :(得分:0)

结帐这个:

void main()
{
    char s[1000]="i am a good boy,he  is a good boy";
    char rep[100]="good";
    char newstr[100]="bad";
    char result[1000] = "";
    char *tmp;
    int len;
    char *k=s;
    char *res = result;
    while(1) 
    {
        tmp=strstr(k,rep);
        if(tmp==NULL)
            break;
        len=tmp-k;  
        tmp=tmp+strlen(rep);    
        strncpy(res,k,len);
        strcat(res,newstr); 
        res += len + strlen(newstr);
        k=k+len+strlen(rep);        
    }
    if(!tmp)
        strcat(result,k);
    puts(result);   
}

一些注意事项:
1)new是一个关键字,你不能像这样命名变量 2)你应该使用""来初始化结果字符,这样你就可以正确地对它进行strcat' int 3)你应该检测到strcat结果的位置(用char * res指针完成)