forme récursive de changer plusieurs espaces en un seul espace

Dupliquer possible:
J’essaie de rendre ce code récursif, mais pour une raison quelconque, il ne fonctionne pas

J’essaie d’écrire un programme en utilisant RECURSION pour changer plusieurs espaces en un seul espace peut-il aider? Par exemple, “a_______b” devient “a_b”, c’est une tâche qu’il essaie de faire depuis longtemps! quelqu’un peut-il aider?

Ici, j’ai essayé cela, mais je pense que la conception ne fonctionne pas pour la récursivité

void text_r(char *str) { char *dst = str; if(*str=='\0')return ; *dst++ = *str; if (isspace(*str)) { do ++str; while (isspace(*str)); --str; } return text_r(str++); } 

j’ai écrit le code sans récursion mais j’ai un problème pour le convertir

void compress_spaces (char * str) {char * dst = str;

  for (; *str; ++str) { *dst++ = *str; if (isspace(*str)) { do ++str; while (isspace(*str)); --str; } } *dst = 0; 

}

Version récursive (évitant toute partie itérative, comme tout ) utilisant le même pointeur, donné deux fois en argument

 void recur(char *str, char *out) { if (*str!=' ' || str[1]!=' ') *out++ = *str; if (*str) recur(str+1, out); } 

Version récursive avec un seul paramètre

 void recur(char *str) { static char *out = NULL; if (out == NULL) out = str; if (*str!=' ' || str[1]!=' ') *out++ = *str; if (*str) recur(str+1); } 

Version itérative

 void iter(char *str) { char *out = str; do { if (*str!=' ' || str[1]!=' ') *out++ = *str; } while (*str++); } 

Être appelé comme

  char str[] = " abc def "; // either recursive recur(str, str); // or iterative iter(str); 

Pas la meilleure méthode mais essayez quelque chose dans ce sens

 char* remove_space(char *str) { char *dst = str; while(*str!=' ' ||*str !='\0') *dst++ = *str; if (isspace(*str)) { do ++str; while (isspace(*str)); --str; } return strcat(dst,remove_space(str++)); } 

L’idée étant que vous trouviez des caractères et que vous les stockiez dans une chaîne, lorsque vous atteignez un espace, vous stockez le premier et ignorez le rest. Ensuite, vous pouvez envoyer la nouvelle chaîne à la fonction à nouveau. et vous retournez le résultat concatinated avec la nouvelle chaîne

PS Le code ci-dessus ne sera probablement pas compilé, mais il devrait vous donner une bonne idée de la façon de procéder.

Élaborer un peu:

crée une fonction qui enregistre tous les caractères dans un espace, puis ignore tous les espaces consécutifs et envoie la chaîne restante à une fonction qui renvoie une chaîne vierge. ensuite, il joint les deux chaînes pour en faire une chaîne plus grande et plus nette.

Voici ma mise en œuvre. Je remplace chaque bande de plusieurs espaces en conservant le dernier caractère d’espace et supprime cette bande lorsqu’un caractère non-espace est trouvé

 void reduce(Ssortingng s, int curIndex, int lastSpaceIndex) if (lastSpaceIndex != -1) if s[curIndex] is not a space then replace subssortingng from s[lastSpaceIndex, curIndex-1] by a space else reduce(s, curIndex+1, lastSpaceIndex); else if s[curIndex] is not a space then reduce(s, curIndex+1, -1) else reduce(s, curIndex+1, curIndex)