0

プログラムを見つけようとして、何時間もプログラムを分解してきました。最終的に数行のコードに制限しましたが、それでも問題を見つけるのはまだ愚かです (または疲れています)。

ポインターを使用した文字列コピー関数だけです。誰かがそれを見てもらえますか?

void stringCopy(char *sourcePtr, char *destPtr)
{
    while(*sourcePtr!='\0')
    {
        *destPtr=*sourcePtr;
        destPtr++;
        sourcePtr++;
    }
}

どういうわけか文字列の制限を超えているように、文字列にガベージ値を挿入しています。

また、長さが 10 未満の文字列をコピーするためにのみ使用されます。宣言されたコピー元配列とコピー先配列のサイズは 20 です。すべてがハードコードされています。

strcpy を使用しますが、これはクラスの割り当てであり、許可されていません。

編集:最終的なヌル文字を宛先に入力するのを忘れただけです! 皆さん、お手数をおかけして申し訳ありません!

4

3 に答える 3

4

最も単純なstrcpyX()関数:

void strcpyX(char *dest, const char *src){
   while(*src) *dest++ = *src++;
   *dest = '\0';
}

これは、目的地に十分なスペースを確保している場合にのみ機能することを覚えておいてください。

'\0'また、正しく出力するには、目的地を a (現在のコードにはありません) で終了する必要があります!

于 2013-02-15T04:54:02.960 に答える
3

終了ヌル文字のコピーに失敗しています。これを修正するには、

*destPtr = 0;

関数の ed で。

しかし、私の目には、以下が最も単純な strcpy スタイルの関数です。私の記憶が正しければ、このバージョンは K&R に掲載されました。

void stringCopy(char *sourcePtr, char *destPtr) {
    while(*destPtr++ = *sourcePtr++)
        ;
}

これにより、文字列全体がコピーされ、終端の nul がコピーされた後にのみ停止します。

于 2013-02-15T05:30:13.657 に答える
0

コードの唯一の問題は、'\0'宛先にコピーしていないことです。以下のコードは完全に機能します

/* strcpy: copy t to s */
void strcpy(char *s, char *t)
{
    while ((*s = *t)!=‘\0’) {
         s++;
         t++;
    }
}
于 2013-02-15T05:02:04.387 に答える