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)