58 votes

Comment supprimer le caractère à un index donné d'une chaîne en C ?

Comment supprimer un caractère d'une chaîne ?

Si j'ai la chaîne "abcdef" et que je veux supprimer "b" comment faire ?

Supprimer le premier caractère est facile avec ce code :

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

et

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

me donnera la chaîne sans le dernier caractère, mais je n'ai toujours pas compris comment supprimer un caractère au milieu d'une chaîne.

75voto

stacker Points 34209

memmove peut gérer les zones qui se chevauchent, j'essayerais quelque chose comme ça (pas testé, peut-être +-1 problème)

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

Avant : "abcdef"

Après : "abdef"

47voto

Fabio Cabral Points 608

Essaye ça :

 void removeChar(char *str, char garbage) {

    char *src, *dst;
    for (src = dst = str; *src != '\0'; src++) {
        *dst = *src;
        if (*dst != garbage) dst++;
    }
    *dst = '\0';
}

Programme d'essai :

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

Résultat:

 >>acdef

17voto

tBlabs Points 642

Ma façon de supprimer tous les caractères spécifiés :

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

4voto

MD XF Points 7062

Vraiment surpris que cela n'ait pas été posté avant.

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

Plutôt efficace et simple. strcpy utilise memmove sur la plupart des implémentations.

3voto

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

Essaye ça . memmove le chevauchera. Testé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X