0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void rec(char pin[]);

main()
{
      char pin[100];
      printf("Give word: ");
      scanf("%s", pin);
      rec(pin);
      system("pause");
}

void rec(char pin[])
{
     int i=0;
     if (pin[i]=='\0')
        return;

     else
     {    
        rec(pin[i+1]);
        printf("%c", pin[i]);

     }

}

うまくいかないようですが、理由はわかりません。(for ループ、関数 strlen などの使用は許可されていません)。

4

4 に答える 4

3

rec関数のelse部分では、要素のアドレスである必要がある要素を渡しています.else部分でこれを試してください

else
     {    
        rec(&pin[i+1]);
        printf("%c", pin[i]);

     }
于 2013-05-17T07:52:47.040 に答える
1

さて、あなたの質問は「なぜうまくいかないのか」なので、まさにそれに答えるかもしれません。

re()宣言は単なるタイプミスであると想定しrec()ます-もちろん、それを修正する必要があります。

その関数の最初の行で、変数を宣言しますint i = 0;。ただし、その変数が再度割り当てられることはありません。関数をスキャンして割り当てをi探します。何も見つかりません。したがって、そのi変数は定数 0 です。それを念頭に置いて、コードを置き換えi0、もう一度コードを書きましょう。

if (pin[0]=='\0')
    return;
else
{    
   rec(pin[1]);
   printf("%c", pin[0]);
}

問題のある行は明らかにrec(pin[1]). char *関数は引数、つまり文字列を期待します (関数のパラメータ宣言ではchar *とは同じであることに注意してください)。char []ただし、pin[1]は の 2 番目の文字にすぎませんpin。そこで行っているのは、その文字を暗黙的にポインターに変換して関数に渡すことです。これは正しくありません。

渡したいrec()のは、 の 2 番目の文字から始まる文字列へのポインタになるため、2 番目の文字へのポインタですpin。したがって、正しい呼び出しはrec(pin + 1)ではなくになりrec(pin[1])ます。pin文字列の最初の文字を指すのでpin + 1、2 番目の文字を指します。

于 2013-05-17T07:56:39.693 に答える
0
void rec(char pin[]){
    if (*pin=='\0')
        return;
    else {
        rec(pin + 1);
        printf("%c", *pin);
    }
}
于 2013-05-17T08:42:12.897 に答える