-3

私が使用しているコード:

char** list  
char** final;
char* target;
char* replace;
int wCounter, cCounter, i, hashCounter = 0, addLetter = 0;
int copyWord, countChars, numOfWords, finalWords = 0, temp;

//stuff here

for(wCounter; wCounter < temp + numOfWords; wCounter++, finalWords++)
{
    printf("Original string: %s\n", list[wCounter+1]);
    final[finalWords] = strstr(list[wCounter+1], target);

    if(final[finalWords] != NULL)
        memcpy(final[finalWords], replace, strlen(target));

    printf("Final string: %s\n\n", final[finalWords]);
}

//stuff here

私のプログラム出力:

Target string = h   Replacement string = j

Original string: hello
   Final string: jello //works!!!

Original string: happy birthday
   Final string: jappy birthday  // should be jappy birtjday

Target string = ra  Replacement string = ar

Original string: radar
   Final string: ardar   //works!!!

Original string: are you ready
   Final string: (null)  //awkward

Original string: pirate radio rating
   Final string: arte radio rating //should be piarte ardio arting

Target string = x   Replacement string = zz

Original string: exit
   Final string: zit   //should be zzit

Original string: x-ray
   Final string: z-ray  //should be zz-ray

Original string: xerox
   Final string: zerox //should be zzerox

私のプログラムにはターゲット文字列(たとえば「h」)があり、置換文字列(たとえば「j」)もあります

'h'が表示されるたびに、'j'に置き換える必要があります

お誕生日おめでとうはjappybirtjdayでなければなりません。

4

2 に答える 2

3

OK、あなたのコードにはいくつかの問題があります。

まず最初に: strstr は、一致するシーケンスの最初の出現へのポインターのみを返します (詳細については、こちらを参照してください)。そのため、2 回目または 3 回目の発生へのポインタを取得することはありません。ここでコンセプトを作り直す必要があります。

第二に、 memcopy を使用して何かを置き換えることは、置き換えが置き換えられる部分と同じ長さである場合にのみ機能します。次の例を検討してください。

Address:  0123456789ABCD
Original: This is a test
Target: is
Replacement foo

置換がターゲットの長さを超えていることに注意してください。あなたのコードでは何が起こるでしょうか?strstrはアドレス 2 を返します。このポインタを に渡しますmemcpy。得られるのは次の文字列です。Thfo is a test

「foo」の 2 番目の「o」が欠落していることに注意してください。これは、ターゲット文字列のバイト数だけをコピーするためです。置換と同じ数のバイトをコピーした場合、 のような文字列になってしまいますThfoois a test。かろうじて良くないですか?

ソリューションのコンセプトについてもう一度考えてみることをお勧めします。おそらく、より良いアプローチは、ターゲット文字列の出現によって文字列を「トークン化」し、要素を連結して目的の結果を取得することです。

于 2013-02-11T07:12:22.593 に答える
1

このmemcpy関数は、ある文字列を別の文字列に置き換えるためのものではありません。両方の文字列の長さが同じである場合にのみ意図したとおりに機能し、複数の文字列を置き換えることはありません仕事をするにはstr_replaceのようなものが必要です。

于 2013-02-11T06:55:55.397 に答える