0

このコードはインターネットから入手しましたが、コード全体を入手できませんでした。たとえばif(*str)。このコードはどういう意味ですか?また、文字列を返すことはできますか?mainの配列は関数で直接変更できると思いましたが、ここでは返されます。

#include<stdio.h>
#define MAX 100
char* getReverse(char[]);

int main(){

    char str[MAX],*rev;

    printf("Enter  any string: ");
    scanf("%s",str);

    rev = getReverse(str);

    printf("Reversed string is: %s\n\n",rev);
    return 0;
}    

char* getReverse(char str[]){

    static int i=0;
    static char rev[MAX];

    if(*str){
         getReverse(str+1);
         rev[i++] = *str;
    }

    return rev;
}
4

1 に答える 1

1

これは、静的変数を使用しているため、再帰の最も明確な例ではありません。うまくいけば、コードは一般的にあなたに明確に見えるでしょう、私はあなたに混乱している部分が最初に私に混乱していたのと同じであると思います。

if(*str){
     getReverse(str+1);
     rev[i++] = *str;
}

したがって、行ごとに。

if(*str){

ヌルターミネータに達していない場合。

     getReverse(str+1);

getReverse文字列の次の文字で関数を呼び出します。ここまではかなり簡単なようです。しかし、これは次の行であるため、実際には何も反転しない可能性もあるようです

     rev[i++] = *str;

istrとincrementの先頭にインデックスを割り当てますiが、ここで注意が必要な部分があります。iあなたが思っていることではないかもしれません。getReverseiは、インクリメントされる前に呼び出されます。またi、静的であるため、関数呼び出し間で変更が持続します。したがって、5文字の単語があるとしましょう。「馬」とすると、スタック上で6回の呼び出しが発生しますgetReverse。6番目はヌルターミネータを見つける場所であるため、何もしません。秘訣は、呼び出しを逆の順序で解決することです。最初に、strが「e」を指している呼び出しは解決されて増分しますi。これは、他のすべての呼び出しがまだ呼び出しがgetReverse戻るのを待っているためです。したがって、最後の文字は実際には最初に追加されて増分される文字ですiこれがここで混乱する可能性があります。

于 2012-08-07T16:05:10.547 に答える