2

私は現在Cを勉強していますが、この演習を乗り越えることはできません。string1に逆戻りする再帰関数を作成する必要がありますstring2。これが私のコードです。よろしくお願いします。

#include <stdio.h>
#define MAX 100

void reverse(char s1[],char s2[],int n,int j);

int main()
{
    char string1[MAX]="How Are You Mate";
    char string2[MAX]="";
    int n=0;
    int i=0;
    int j=0;

    for(i=0;string1[i]!='\0';i++)
        n++;
    reverse(string1,string2,n,j);
    printf("String-a normal:\n%s\n",string1);
    printf("String-a reverse:\n%s\n",string2);
    return 0;
}

void reverse(char s1[],char s2[],int n,int j)
{
     if(n>0)
     {
            s2[j]=s1[n];
            reverse(s1,s2,n-1,j+1);
     }
     else
            s2[j]='\0';
}
4

5 に答える 5

5

インプレース (呼び出し元は、この関数を呼び出す前に文字列のコピーを作成できます) 末尾再帰による文字列反転

void reverse (char *str, size_t len)
{
  char tmp;
  if (len-- < 2) return;

  tmp = *str;
  *str = str[len];
  str[len] = tmp;

  reverse (str+1, len -1);
}

O、ポインタが必要ない場合:

void reverse (char str[], size_t len)
{
  char tmp;
  if (len-- < 2) return;

  tmp = str[0];
  str[0] = str[len];
  str[len] = tmp;

  reverse (str+1, len -1);
}
于 2013-03-10T11:41:07.890 に答える
3

反転は、配列のn- 番目の文字を にコピーすることから始まります。番目の文字はたまたまヌル ターミネータです。これは新しい文字列の最初の文字になるため、文字列は.string1string2nprintf

通話中

reverse(string1,string2,n-1,j);

からmain問題を解決する必要があります。の条件も からにreverse変更する必要があります。if(n>0)if(n>=0)

于 2013-03-10T11:36:14.307 に答える
2

結果の文字列はどこにも保存されませんが、アイデアは得られます。

#include <stdio.h>

void rev (const char* str);

int main () {
    const char str[] = "!dlrow ,olleH";

    printf("%s\n", str);

    rev(str);
    printf("\n");

    return 0;
}

void rev (const char* str) {
    char c = *str;
    if (c != '\0') {
            rev(str + 1);
        printf("%c", c);
    }
}
于 2013-03-10T11:42:51.937 に答える
1

プログラムを修正しました。以下の変更を見つけてください

void reverse(char s1[],char s2[],int n,int j)
{
 if(n>0)
 {
        s2[j]=s1[n-1];
        reverse(s1,s2,--n,++j);
 }
 else
        s2[j]='\0';
}
于 2013-12-09T12:03:33.447 に答える