0

ポインターを使用して文字列を反転するこの C プログラムのアルゴリズムを順を追って説明していただけますか?

#include <stdio.h>

int main()

{
    char str[50];
    char rev[50];
    char *sptr = str;
    char *rptr = rev;

    int i=-1;
    printf("Enter any string : ");
    scanf("%s",str);

    while(*sptr)
    {
        sptr++;
        i++;
    }

    while(i>=0)
    {
        sptr--;
        *rptr = *sptr;
        rptr++;
        --i;
    }


    *rptr='\0';
    printf("Reverse of string is : %s",rev);
    return 0;
}
4

3 に答える 3

6

魔法はこのループにあります:

while(i>=0) // while there are more letters... (i was previously set to the number of letters)
{
    sptr--;  // decrement source pointer (points to end of source string
    *rptr = *sptr; // copy char
    rptr++; // increment target pointer
    --i; // decrement number of chars remaining
}

実際、かなり簡単です。

于 2013-11-01T13:32:08.047 に答える
2

このサイクル

while(*sptr)
{
    sptr++;
    i++;
}

sptr文字列のゼロ終端文字に到達するまでインクリメントして、文字列を反復処理します。サイクルの後、i文字列の長さに対応します。次に、このサイクルで:

while(i>=0)
{
    sptr--;
    *rptr = *sptr;
    rptr++;
    --i;
}

isptrin が指す文字の前の文字をコピーしてから、rptrsptr をデクリメントして、前の文字を指すようにします。

于 2013-11-01T13:30:46.217 に答える
1

この while ループはサイズを計算します。while式が 0 に評価されると終了します。C 文字列は null 端子で終了します。整数にキャストすると 0 になります。したがって、このループは、ヌル ターミネータ == 0 の存在によって示される C 文字列の末尾を検出するまで続きます。 sptr と i は文字列を下に移動し、文字数をカウントします。次の文字。最終的sptrには、入力文字列の末尾を指します。

 while(*sptr)
 {
     sptr++;
     i++;
 }

次のループでは、まだ文字が残っている間に (このループの前の i が文字列のサイズであることを思い出してください)、文字列をsptr後方に移動します (最後のループは文字列の末尾を指していました)。その間rptr、別の文字列が別の文字列を進んでいます。このステートメントは、後方から前方に移動して文字列を逆*rptr = *sptrにコピーします。sptr*rptr

while(i>=0)
{
    sptr--;
    *rptr = *sptr;
    rptr++;
    --i;
}
于 2013-11-01T13:31:27.250 に答える