2016-07-14 4 views
-1

私はこの機能を持っている:私はそれを使用する場合特定の文字を置き換える関数が、文字の最初のインスタンスに対してのみこれを行うのはなぜですか?

char *replace_str(char *str, char *orig, char *rep) 
{ 
static char buffer[4096]; 
char *p; 

if(!(p = strstr(str, orig))) 
    return str; 

strncpy(buffer, str, p-str); 
buffer[p-str] = '\0'; 

sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig)); 

return buffer; 
} 

、それだけで置き換えられる文字の最初のインスタンスを変更します。すべてのキャラクターにこれをさせることができる方法はありますか?

+3

はい。交換すべきものがすべて交換されるまで、交換を繰り返します。 – MikeCAT

+0

Lol。ちょっと冗長になっていたことに気付きました。ありがとうございます; –

+0

このアプローチは、 'rep'が' orig'よりも長くない場合にのみ機能します。 – FredK

答えて

1

私が正しく理解している場合、置換文字列の終わりの後に文字列の先頭を再割り当てするループが必要です。 strstrはstrの最初の単語origのポインタを返すので、実際には関数は1回だけアクションを実行します。

EDIT:これはあなたにそれを行う方法のアイデアを与えるかもしれません。このコンピュータではテストできないため、直接動作しない可能性があります。 私はmallocを使っていましたが、静的なcharをこの方法で使用しないでください。この関数の将来の使用のために、値をバッファーに保管することが想定されています。この関数を再利用すると、関数の前回の戻り値が失われてしまいます... これが私のやり方です。それを行うにはより効率的な方法があります。この関数の利点は、任意の文字列長に適応することです。

char *replace_str(char *str, char *orig, char *rep) 
{  
    char *buffer; 
    char *previous_version; 
    char *p; 
    size_t occurring_position; 

    if (strcmp(orig, rep) == 0) 
    { 
    return(str); 
    }   
    buffer = strdup(str); 
    while ((p = strstr(buffer, orig))) 
    { 
    occuring_position = p - buffer; 
    previous_version = strdup(buffer); 
    free(buffer); 
    buffer = malloc(strlen(previous_version) + strlen(rep) - strlen(orig)); 
    strcnpy(buffer, previous_version, occurring_position); 
    strcpy(buffer, rep); 
    strcpy(buffer + occurring_position + strlen(rep), previous_version + occurring_position + strlen(orig)); 
    free(previous_version); 
    } 
    return (buffer); 
} 
+0

あなたの答えをありがとう。私はそれが正しく実装されているかどうかはわかりません。どこに私は入れますか?それは完全に私の文字列を削除しています。 –

+0

@Damien「バッファ」とは何ですか? 4096はどこから来たのですか?ああ - 今は元のコードで表示されますが、あなたの答えには表示されません。 – FredK

関連する問題