2

次のコードを使用して、HTML ファイルを配列にコピーしました。

fseek(board, 0, SEEK_END);
long int size = ftell(board);
rewind(board);
char *sourcecode = calloc(size+1, sizeof(char));
fread(sourcecode, 1, size, board);

ここでの目標は、配列内の特定のコメントを、既に定義されている文字列 'king' に置き換えることです。例えば

< html コード>< !comment>< その他の html コード>

< html code>キング< more html code>

次のコードを使用しています:

    find_pointer = strstr(sourcecode, text2find);
    strcpy(find_pointer, king);
    printf("%s", sourcecode);

where text2find = "< !comment>";

ただし、印刷すると、「王」を過ぎたすべての文字が消去されていることが明らかです..終了文字が自動的に追加されたかのように。< more html code> がそのまま残るようにするには、どうすればこれを修正できますか?

EDIT::::: strncpy を使用し、終端文字が追加されないように文字数を設定しました。これは最良の方法ですか?

4

4 に答える 4

4

交換したいものがまったく同じサイズでない限り、基本的にそれはできません。その場合、 または のいずれかを使用できmemcpyますstrncpy

サイズが異なる場合は、次の行に沿って何かを試すことができます。

char *buffer = malloc(size); // size should be big enough to store the whole final html code
find_pointer = strstr(sourcecode, text2find);
len = find_pointer - sourcecode;
memcpy (buffer, sourcecode, len);
memcpy (buffer + len, "king", 4);
memcpy (buffer + len + 4, find_pointer + 4, strlen(sourcecode) - len - strlen(text2find)); 
free(sourcecode);
sourcecode = buffer;
于 2012-06-03T23:56:22.100 に答える
3

さて、strcpy0ターミネータを追加します。したがって、文字列の残りの部分はそのまま残りますが、標準の文字列処理関数は 0 ターミネータで停止するため、それを認識しなくなります。スペースで手動で上書きするか、memcpy代わりに使用することができますstrcpy

于 2012-06-03T23:55:10.040 に答える
1

たとえばC++と比較して、非常に低いレベルで操作を実行するため、C文字列内の文字を置き換えるのは面倒です。あなたは文字通りそれのためのアルゴリズムを考え出す必要があります!

まず、インプレース置換が常に可能であるとは限らないことに注意してください。置換するサブストリングが置換よりも短い場合は、より多くのメモリを割り当てる必要があります。どちらの方法でも結果にメモリを割り当てる方が簡単なので、次のように進めることができます。

  • 置換の文字列の長さを見つけます。そのためには、置き換えるコメントの最初と最後を見つけて、計算を行う必要があります。
  • 次に、結果に新しいメモリチャンクを割り当て、ソースを置換ポイントまでmemcpyします。
  • 次に、置換文字列をコピーし、最後にソースの終了部分を結果にコピーします
  • 最後に、ソース文字列のバッファを解放し、結果を返します。
于 2012-06-04T00:07:42.577 に答える
0

まず、境界チェックを実際に実行するため (つまり、指定された数の文字のみをコピーする)を使用する必要がありますstrncpy(または、使用可能な場合はなおさらです)。strlcpyそうしないと、宛先文字列の末尾を超えてメモリをコピーしようとすることになり、未定義の破壊的な動作が発生する可能性があります。次に、次のような関数を使用しstrncpyたりmemcpy、終端のヌル文字をコピーしないようにしても、上書きしようとしている文字列の長さが、上書きしようとしている文字列とは異なるため、目的の文字列は適切にフォーマットされません。コピー。

于 2012-06-04T00:00:46.277 に答える