2013-03-10 4 views
2

J'étudie actuellement le C et je ne peux pas dépasser cet exercice. Je dois créer une fonction récursive pour inverser string1 en string2. Voici mon code. J'apprécierais volontiers votre aide.Inverser une chaîne en utilisant une fonction récursive

#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'; 
} 
+0

ce qui est 's2 []' pour? –

+0

Le code compile bien, le problème est qu'il ne montre aucun caractère lorsque j'imprime la chaîne 2. – Lind

+0

s2 [] représente la deuxième chaîne – Lind

Répondre

3

retourneur commence en copiant le caractère n -ème de tableau dans string1string2. Le caractère n -th se trouve être le terminateur null. Il devient le premier caractère de votre nouvelle chaîne, donc la chaîne semble vide pour toutes les routines C standard, y compris printf.

Appel

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

du main devrait résoudre le problème. La condition dans le reverse doit également être modifiée de if(n>0) à if(n>=0).

+0

Merci c'est la réponse que je cherchais.J'ai fait la condition string1 [i]! = '\ 0' dans la boucle for, mais j'ai commencé à compter à partir du premier caractère, et je pense que c'est le problème ici. – Lind

+0

Je n'ai pas mis n-1 sur la fonction mais j'ai déclaré int n = -1. Comme pour le n> = 0 qui était nécessaire merci. – Lind

+0

@Lind Commencer 'n' à' -1' fonctionnerait aussi. Par ailleurs, vous pouvez supprimer la déclaration de 'j' de' main', car elle est affectée de zéro, et n'est pas modifiée après cela, donc vous pouvez passer '0' comme dernier paramètre de' reverse' pour le même effet . – dasblinkenlight

5

en place (l'appelant pourrait faire une copie de la chaîne avant d'appeler cette fonction) chaîne inverse avec la queue-récursion

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, si vous ne voulez pas des pointeurs:

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); 
} 
+0

Cela fonctionne pour.Merci – Lind

+0

Mais pouvez-vous l'expliquer à votre professeur? – wildplasser

+0

J'ai corrigé ma solution originale, et oui je la comprends, même si je dois relire des pointeurs car je n'ai pas une idée claire sur eux. – Lind

2

Bien qu'il ne enregistrer la chaîne résultante partout, vous avez l'idée.

#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); 
    } 
} 
+0

merci mais je n'ai pas encore lu de pointeurs. : P – Lind

1

J'ai corrigé le programme. S'il vous plaît trouver les modifications ci-dessous

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'; 
} 
0

je recommande d'utiliser la bibliothèque, taille = strlen (tableau) au lieu de

for(i=0;string1[i]!='\0';i++) 
n++; 

pour compter le nombre de caractères dans ARRA

Questions connexes