0

以下の機能について3点質問があります。コード内でコメントとしてマークしました。

  1. dest( malloced memory) が指す char 項目を にコピーdPtrし、最後に (入力文字列の処理後) にコピーするのはなぜですかreturn dest。で操作する方が簡単ではないでしょうかdest

  2. この関数は基本的に、ダッシュが含まれている場合にのみ単語を反転します。マークされたコマンド*subword = '\0';NUL、以前にインクリメントされた場所 ( strncpy)の場所に文字を配置subword+1しますか? またはsubword?

  3. この関数は、バッファ オーバーフローやその他の望ましくない動作を起こしやすいですか? 今ではエラーは発生しませんが、デバッグ方法がわからないだけだと思います。


lenstrlen(word)

char* function(char* word, int len)
{
    char* subword = NULL;
    char* dest;
    char* dPtr;
    size_t n;

    dest = malloc(len+1);
    if (dest == NULL) return NULL;

    dPtr = dest;               /* [1] */

    while((subword = strrchr(word, '-'))!= NULL) {

        n = len - (subword-word) - (dPtr-dest);
        if (n-1 > 0)
            strncpy(dPtr, subword+1, n-1);

        *subword = '\0';      /* [2] */
        dPtr += n-1;
        *dPtr = '-';
        dPtr++;
    }
    strncpy(dPtr, word, len - (dPtr-dest));
    dest[len] = '\0';
    return dest;              /* [1] */
}
4

3 に答える 3

1
  1. dPtr文字列内を移動して変更するために使用されています。dest変更された文字列の先頭として保持され、最終的には関数の戻り値になります。各ループ反復dPtrの終わりに、は変更された文字列の終わりを指し、連続する各。に使用されますstrncpy。最終的に、関数は変更された文字列を返し、そのdest開始を追跡するために必要です。

  2. subwordおそらくnullで終了しているため、ループ内subwordの結果にの文字のみがコピーされstrncpyますが、実際には、を使用する必要はありませんstrncpy。関数は、ダッシュを探して文字列を逆方向に移動します。ヒットごとにsubword、次のダッシュで区切られたサブストリングです。サブ文字列は、元の文字列内のメモリの一部であり、nullで終了していません。を使用している場合は、のnullstrcpy終了が必要ですが、nullターミネータsubwordを使用しているため、必要ではありません。値を制限としてstrncpy注意してください。このコードはnullで終了しますnstrncpysubword 、つまり、元の文字列引数内にヌル文字を貼り付けることによって。これは#3につながります:

  3. 望ましくない動作に関しては、関数は元の文字列引数を変更することで機能しますsubword-変更されて返された文字列用の独自のバッファを保持している場合でも、それらのnullターミネータをソース文字列に入れます-。

最後に、コードは、ではなく操作dPtrを使用することなく実行できます。strncatstrncpy

于 2012-08-31T16:04:25.940 に答える
1
  1. 直接変更destすると、関数によって返される値は同じではありません。したがって、一時ポインタを渡す必要があります。
  2. 文字は(文字の代わりに)\0の場所に置かれます。*subword-
于 2012-08-31T15:55:58.113 に答える
1

dest が指す char アイテム (malloced メモリ) を dPtr にコピーし、最後に (入力文字列の処理後) dest を返すのはなぜですか。destで操作する方が簡単ではないでしょうか。

関数の終わりまでに、は文字列dPtrの先頭を指していないdestため、そのポインタがdestそれ自体だった場合、作成した宛先文字列全体を返すことはできませんでした。

于 2012-08-31T15:53:52.127 に答える