comment insérer plusieurs caractères dans une chaîne en C

Je souhaite insérer des caractères dans une chaîne en C:

Exemple: char ssortingng[100] = "20120910T090000";

Je veux faire quelque chose comme "2012-09-10-T-0900-00"

Mon code jusqu’à présent:

 void append(char subject[],char insert[], int pos) { char buf[100]; strncpy(buf, subject, pos); int len = strlen(buf); strcpy(buf+len, insert); len += strlen(insert); strcpy(buf+len, subject+pos); strcpy(subject, buf); } 

Quand j’appelle cela la première fois que je reçois: 2012-0910T090000

Cependant, lorsque je l’appelle une seconde fois, je reçois: 2012-0910T090000-10T090000

Toute aide est appréciée

Voici un code de travail, qui me donne la sortie:

 Ssortingng: <<20120910T090000>> Ssortingng: <<2012-0910T090000>> Ssortingng: <<2012-09-10T090000>> Ssortingng: <<2012-09-10-T090000>> Ssortingng: <<2012-09-10-T-090000>> Ssortingng: <<2012-09-10-T-0900-00>> 

Il utilise memmove() car il est garanti que les chaînes en cours de copie se chevauchent.

 #include  #include  #include  static void insert(char *str, size_t len, char c, size_t pos) { memmove(&str[pos+1], &str[pos], len - pos + 1); str[pos] = c; } int main(void) { char ssortingng[25] = "20120910T090000"; // I want to make it something like "2012-09-10-T-0900-00" char inschr[] = "-----"; int inspos[] = { 4, 7, 10, 12, 17 }; enum { NUMCHR = sizeof(inschr) / sizeof(inschr[0]) }; enum { NUMPOS = sizeof(inspos) / sizeof(inspos[0]) }; assert(NUMCHR == NUMPOS + 1); size_t length = strlen(ssortingng); printf("Ssortingng: <<%s>>\n", ssortingng); for (int i = 0; i < NUMPOS; i++) { insert(string, length, inschr[i], inspos[i]); length++; printf("String: <<%s>>\n", ssortingng); } return(0); } 

Bien entendu, je suppose que C99 prend en charge la notation de boucle for . Notez également que, dans le style C classique, le code ne prend pas la taille de la chaîne cible et ne garantit donc pas l’absence de débordement de mémoire tampon. Il ne serait pas si difficile d’append le paramètre et de faire la vérification; le problème est de savoir comment indiquer que la fonction a échoué. Vous pouvez utiliser une interface différente pour la fonction, en prenant des chaînes de longueur arbitraire pour les insérer à des positions arbitraires; ce n’est pas beaucoup plus difficile …

 Ssortingng: <<20120910T090000>> Ssortingng: <<2012-0910T090000>> Ssortingng: <<2012-09-10T090000>> Ssortingng: <<2012-09-10-T090000>> Ssortingng: <<2012-09-10-T-090000>> Ssortingng: <<2012-09-10-T-0900-00>> #include  #include  #include  static int insert(char *str, size_t max, size_t len, char *ins, size_t pos) { assert(str[len] == '\0'); assert(len < max); size_t inslen = strlen(ins); if (len + inslen + 1 >= max) return -1; memmove(&str[pos+inslen], &str[pos], len - pos + inslen); memmove(&str[pos], ins, inslen); return len + inslen; } int main(void) { char ssortingng[25] = "20120910T090000"; // I want to make it something like "2012-09-10-T-0900-00" char *insstr[] = { "-", "-", "-", "-", "-" }; int inspos[] = { 4, 7, 10, 12, 17 }; enum { NUMSTR = sizeof(insstr) / sizeof(insstr[0]) }; enum { NUMPOS = sizeof(inspos) / sizeof(inspos[0]) }; size_t length = strlen(ssortingng); assert(NUMSTR == NUMPOS); printf("Ssortingng: <<%s>>\n", ssortingng); for (int i = 0; i < NUMPOS; i++) { int newlen = insert(string, sizeof(string), length, insstr[i], inspos[i]); if (newlen < 0) { printf("Oops! failed to insert [%s] into [%s]\n", insstr[i], string); break; } length = newlen; printf("String: <<%s>>\n", ssortingng); } return(0); } 

Vous pouvez faire quelque chose comme ça:

  char src[100] = "20120910T090000"; char mask[] = "NNNN-NN-NN-C-NN-NN-NN"; char dest[100] = {0}; for (size_t s = 0,m = 0, d = 0; s < strlen(src) && m < strlen(mask); ++m) { switch (mask[m]) { case 'N': assert(isdigit(src[s])); dest[d++] = src[s++]; break; case 'C': assert(isalpha(src[s])); dest[d++] = src[s++]; break; default: dest[d++] = mask[m]; break; } }