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