Supprime une sous-chaîne en C en prenant des positions de sous-chaîne

Disons que j’ai un char *example qui contient 20 caractères. Je veux supprimer tous les caractères de l’ example[5] à l’ example[10] , puis corriger le tableau afin que l’ example[11] vienne juste après l’ example[4] .

En gros, décaler tous les caractères après la région supprimée vers lorsque la région supprimée a commencé.

Des idées?

EDIT: Je pense qu’il pourrait y avoir un moyen d’utiliser memcpy? Mais je ne sais pas comment le faire.

Vous ne pouvez pas utiliser memcpy() manière fiable car il y a un chevauchement entre la source et la cible; vous pouvez utiliser memmove() . Puisque vous connaissez les longueurs, vous utilisez:

 memmove(&example[5], &example[11], (20 - 11 + 1)); 

N’oubliez pas que vous devez également copier le terminateur nul.

 #include  #include  int main(void) { char array[] = "abcdefghijklmnopqrst"; char *example = array; printf("%.2zu: <<%s>>\n", strlen(example), example); memmove(&example[5], &example[11], (20 - 11 + 1)); printf("%.2zu: <<%s>>\n", strlen(example), example); return(0); } 

Compilé avec un compilateur C99, cela donne:

 20: <> 14: <> 

Si vous avez un compilateur C89 (plus précisément, une bibliothèque C), vous devrez vous soucier du z dans la chaîne de formatage, qui indique un argument size_t . Il est plus simple de supprimer le z et de strlen() le résultat de strlen() avec (unsigned) .

becquet:

 void cut_the_ssortingng(char *str, size_t cutpos, size_t cutlen) { size_t len; len = strlen(str); if (cutpos >= len) return; if (cutpos + cutlen > len) cutlen = len-cutpos; memmove( str+cutpos, str+cutpos+cutlen, 1+len - cutpos - cutlen); return; } 
  1. décaler les caractères dans une boucle OU
  2. exemple de copie + 11..exemple + 20, coller à l’exemple + 4 OU
  3. ….

Des idées?

Je préparerais un tableau parallèle en copiant tous les caractères du tableau source mais en ignorant les caractères de la plage spécifiée. Facultativement, on peut libérer la mémoire utilisée par la masortingce source si elle n’est pas sur la stack.

 memmove(&example[5], &example[11], strlen(example) - 11 + 1); 

Notez que le comportement de memcpy n’est pas défini lorsque les blocs de mémoire se chevauchent, aussi est-il memmove