¿Eliminar espacios en blanco de una cadena en el lugar?

Vi esto en una “lista de preguntas de la entrevista”. Me hizo preguntarme.

Por supuesto, no se limita al espacio en blanco, por lo general, se puede generalizar fácilmente a “eliminar algún carácter específico de una cadena, en el lugar”.

Mi solución es:

void stripChar(char *str, char c = ' ') { int x = 0; for (int i=0;i<strlen(str);i++) { str[ix]=str[i]; if (str[i]==c) x++; } str[strlen(str)-x] = '\0'; } 

Dudo que haya una más eficiente, pero ¿hay una solución que sea más elegante?

Edición : olvidé totalmente que dejé strlen allí, definitivamente no es eficiente

En primer lugar, i es siempre un lenguaje ineficiente para hacer un bucle sobre una cadena. La condición correcta del bucle es simplemente str[i] , es decir, bucle hasta que str[i] sea ​​el terminador nulo.

Dicho esto, aquí está el algoritmo más simple / conciso que conozco:

 for (size_t i=0, j=0; s[j]=s[i]; j+=!isspace(s[i++])); 

Nota: Mi solución es para la pregunta tal como está escrita en el tema (espacio en blanco) en lugar del cuerpo (carácter particular). Puede adaptarlo fácilmente si es necesario.

C no tiene argumentos predeterminados, y si está progtwigndo en C ++, debe usar std::string y remove_if desde .

Definitivamente, puede hacer esto más eficiente, eliminando las llamadas a strlen , que están convirtiendo un algoritmo O (N) en un algoritmo O (N 2 ), y son totalmente innecesarios. De todos modos, está escaneando la cadena, así que simplemente busque para el NUL usted mismo.

También puede hacer que esto sea más C-idiomático, utilizando dos punteros en lugar de la indexación de matrices. Lo haría así:

 void strip_char(char *str, char strip) { char *p, *q; for (q = p = str; *p; p++) if (*p != strip) *q++ = *p; *q = '\0'; } 
 void prepend(char* s,char ch){ int len = strlen(s); memmove(s, s + 1, len - 1); s[len - 1] = '\x0'; } void RemoveWhitespace(char* InStr, char ch){ int n(0); if (InStr == NULL){ return; } else if ((*InStr) == '\x0'){ return; } else if ((*InStr) != ch){ RemoveWhitespace(InStr + 1,ch); } else{ while ((*InStr) == ch){ prepend(InStr,InStr[0]); n++; } RemoveWhitespace(InStr + n,ch); } }