¿Cómo eliminar el carácter en un índice dado de una cadena en C?

3 minutos de lectura

avatar de usuario
Favolas

¿Cómo elimino un carácter de una cadena?

Si tengo la cadena "abcdef" y quiero quitar "b" ¿Cómo puedo hacer eso?

La eliminación de la primero carácter es fácil con este código:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   char word[] = "abcdef";
   char word2[10];

   strcpy(word2,&word[1]);

   printf("%s\n", word2);

   return 0;
}

y

strncpy(word2,word,strlen(word)-1);

me dará la cuerda sin el último carácter, pero todavía no descubrí cómo eliminar un carácter en el medio de una cuerda

  • todas las apariciones de un carácter determinado: stackoverflow.com/questions/4161822/…

    – Ciro Santilli Путлер Капут 六四事

    27 de abril de 2016 a las 14:27

avatar de usuario
apilador

memmove puede manejar áreas superpuestas, intentaría algo así (no probado, tal vez un problema de +-1)

char word[] = "abcdef";  
int idxToDel = 2; 
memmove(&word[idxToDel], &word[idxToDel + 1], strlen(word) - idxToDel);

Antes: "abcdef"

Después: "abdef"

Prueba esto :

void removeChar(char *str, char garbage) {

    char *src, *dst;
    for (src = dst = str; *src != "https://stackoverflow.com/questions/5457608/'\0'"; src++) {
        *dst = *src;
        if (*dst != garbage) dst++;
    }
    *dst="https://stackoverflow.com/questions/5457608/"\0"";
}

Programa de prueba:

int main(void) {
    char* str = malloc(strlen("abcdef")+1);
    strcpy(str, "abcdef");
    removeChar(str, 'b');
    printf("%s", str);
    free(str);
    return 0;
}

Resultado:

>>acdef

  • ¡Eso es mejor cuando no sabes la posición del personaje que quieres eliminar!

    – gsamaras

    02/01/2015 a las 21:50

  • Dado que este código ya asume que el carácter está presente, ¿por qué no usar simplemente for(dst = str; *dst != trash; dst++){} *dst = ‘\0’;

    – JayB

    5 de febrero de 2015 a las 19:53


Mi forma de eliminar todos los caracteres especificados:

void RemoveChars(char *s, char c)
{
    int writer = 0, reader = 0;

    while (s[reader])
    {
        if (s[reader]!=c) 
        {   
            s[writer++] = s[reader];
        }

        reader++;       
    }

    s[writer]=0;
}

  • votar por una buena estructura y nombres de variables, pudo seguir este código mucho más fácilmente que las breves variaciones anteriores. Gracias

    – As.C

    04/09/2017 a las 23:50

  • ¡Gran solución! Simplemente votaría por el nombre de la función como removeAllCharOccurrences.

    – Sani

    25 de febrero de 2021 a las 13:11

Realmente sorprendido de que esto no se haya publicado antes.

strcpy(&str[idx_to_delete], &str[idx_to_delete + 1]);

Bastante eficiente y simple. strcpy usos memmove en la mayoría de las implementaciones.

char a[]="string";
int toBeRemoved=2;
memmove(&a[toBeRemoved],&a[toBeRemoved+1],strlen(a)-toBeRemoved);
puts(a);

Prueba esto . recuerda lo superpondrá. Probado.

avatar de usuario
pevik

int chartoremove = 1;

strncpy(word2, word, chartoremove);
strncpy(((char*)word2)+chartoremove, ((char*)word)+chartoremove+1,
    strlen(word)-1-chartoremove);

feo como el infierno

avatar de usuario
dan el hombre

Lo siguiente extenderá un poco el problema eliminando del primer argumento de cadena cualquier carácter que aparezca en el segundo argumento de cadena.

/*
 * delete one character from a string
 */
static void
_strdelchr( char *s, size_t i, size_t *a, size_t *b)
{
  size_t        j;

  if( *a == *b)
    *a = i - 1;
  else
    for( j = *b + 1; j < i; j++)
      s[++(*a)] = s[j];
  *b = i;
}

/*
 * delete all occurrences of characters in search from s
 * returns nr. of deleted characters
 */
size_t
strdelstr( char *s, const char *search)
{ 
  size_t        l               = strlen(s);
  size_t        n               = strlen(search);
  size_t        i;
  size_t        a               = 0;
  size_t        b               = 0;

  for( i = 0; i < l; i++)
    if( memchr( search, s[i], n))
      _strdelchr( s, i, &a, &b);
  _strdelchr( s, l, &a, &b);
  s[++a] = "https://stackoverflow.com/questions/5457608/'\0'";
  return l - a;
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad