concaténer un tableau de caractères en C

J’ai un tableau de caractères:

char* name = "hello"; 

Je veux append une extension à ce nom pour le rendre

 hello.txt 

Comment puis-je faire ceci?

name += ".txt" ne fonctionnera pas

Regardez la fonction strcat .

En particulier, vous pouvez essayer ceci:

 const char* name = "hello"; const char* extension = ".txt"; char* name_with_extension; name_with_extension = malloc(strlen(name)+1+4); /* make space for the new ssortingng (should check the return value ...) */ strcpy(name_with_extension, name); /* copy name into the new var */ strcat(name_with_extension, extension); /* add the extension */ 

J’ai un tableau de caractères:

 char* name = "hello"; 

Non, vous avez un pointeur de caractère sur un littéral de chaîne . Dans de nombreuses utilisations, vous pouvez append le modificateur const, selon que vous êtes plus intéressé par le nom du nom ou par la valeur de chaîne ” hello “. Vous ne devriez pas essayer de modifier le littéral (“bonjour”), car de mauvaises choses peuvent arriver .

La principale chose à transmettre est que C n’a pas un type de chaîne approprié (ni de première classe ). Les “chaînes” sont généralement des tableaux de caractères (caractères) avec un caractère nul (“\ 0” ou 0 décimal) pour indiquer la fin d’une chaîne, ou des pointeurs sur des tableaux de caractères.

Je suggérerais de lire Character Arrays , section 1.9 dans The C Programming Language (deuxième édition, page 28). Je recommande fortement de lire ce petit livre (<300 pages) pour apprendre le C.

Suite à votre question, les sections 6 – Tableaux et pointeurs et la section 8 – Caractères et chaînes de la FAQ C pourraient vous aider. Les questions 6.5 et 8.4 pourraient être de bons endroits pour commencer.

J’espère que cela vous aidera à comprendre pourquoi votre extrait ne fonctionne pas. D’autres ont indiqué quels changements sont nécessaires pour que cela fonctionne. Fondamentalement, vous avez besoin d’un tableau de caractères (un tableau de caractères) assez grand pour stocker la chaîne entière avec un caractère de fin (‘final)’ \ 0 ‘. Ensuite, vous pouvez utiliser la fonction standard strcpy de la bibliothèque C (ou mieux encore strncpy) pour y copier le “Bonjour”, puis concaténer à l’aide de la fonction standard strcat (ou mieux encore strncat). Vous voudrez inclure le fichier d’en-tête ssortingng.h pour déclarer les déclarations de fonctions.

 #include  #include  #include  int main( int argc, char *argv[] ) { char filename[128]; char* name = "hello"; char* extension = ".txt"; if (sizeof(filename) < strlen(name) + 1 ) { /* +1 is for null character */ fprintf(stderr, "Name '%s' is too long\n", name); return EXIT_FAILURE; } strncpy(filename, name, sizeof(filename)); if (sizeof(filename) < (strlen(filename) + strlen(extension) + 1) ) { fprintf(stderr, "Final size of filename is too long!\n"); return EXIT_FAILURE; } strncat(filename, extension, (sizeof(filename) - strlen(filename)) ); printf("Filename is %s\n", filename); return EXIT_SUCCESS; } 

Commencez par copier la chaîne en cours dans un tableau plus grand avec strcpy , puis utilisez strcat .

Par exemple, vous pouvez faire:

 char* str = "Hello"; char dest[12]; strcpy( dest, str ); strcat( dest, ".txt" ); 

Vous pouvez copier et coller une réponse ici, ou vous pouvez lire ce que notre hôte, Joel, a à dire à propos de strcat .

asprintf n’est pas standard à 100%, mais il est disponible via les bibliothèques C standard GNU et BSD, vous l’avez donc probablement. Il alloue la sortie afin que vous n’ayez pas à restr là et à compter les caractères.

 char *hi="Hello"; char *ext = ".txt"; char *cat; asprintf(&cat, "%s%s", hi, ext); 
 #include  #include  #include  char *name = "hello"; int main(void) { char *ext = ".txt"; int len = strlen(name) + strlen(ext) + 1; char *n2 = malloc(len); char *n2a = malloc(len); if (n2 == NULL || n2a == NULL) abort(); strlcpy(n2, name, len); strlcat(n2, ext, len); printf("%s\n", n2); /* or for conforming C99 ... */ strncpy(n2a, name, len); strncat(n2a, ext, len - strlen(n2a)); printf("%s\n", n2a); return 0; // this exits, otherwise free n2 && n2a }