forma recursiva de cambiar múltiples espacios a un espacio

Posible duplicado:
Estoy tratando de hacer este código recursivo, pero por alguna razón no funciona

¿Estoy tratando de escribir un progtwig usando RECURSION para cambiar múltiples espacios a un espacio? ¿Alguien puede ayudar? el ejemplo “a_______b” cambia a “a_b”, es una tarea que estoy intentando hacer durante mucho tiempo. Alguien puede ayudar ?

Aquí probé esto, pero creo que el diseño no funciona para la recursión

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

Escribí el código sin recursión pero tengo problemas para convertirlo

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

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

}

Versión recursiva (evitando cualquier parte iterativa, como por ejemplo) usando el mismo puntero, dado dos veces como argumento

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

Versión recursiva con un solo parámetro.

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

Versión iterativa

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

Ser llamado como

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

No es el mejor método pero intenta algo en este sentido.

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

La idea es que encuentre caracteres y los almacene en una cadena y cuando llegue a un espacio, guarde el primero e ignore el rest. A continuación, puede enviar la nueva cadena a la función de nuevo. y devuelve el resultado concatinado con la nueva cadena

Probablemente el código anterior no se compile, pero debería darle una buena idea de cómo abordar esto.

Elaborando un poco:

cree una función que guarde todos los caracteres hasta un espacio, luego ignora todos los espacios consecutivos y envía la cadena restante a una función que devuelve una cadena limpia. luego se une a las dos cadenas para hacer una cadena más grande y limpia.

Aquí está mi implementación. Reemplazo cada banda de espacios múltiples manteniendo el último carácter de espacio y elimino esa banda cuando se encuentra un carácter sin espacio

 void reduce(String s, int curIndex, int lastSpaceIndex) if (lastSpaceIndex != -1) if s[curIndex] is not a space then replace substring 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)