web-dev-qa-db-fra.com

concaténer un tableau de caractères en C

J'ai un tableau de caractères:

char* name = "hello";

Je veux ajouter une extension à ce nom pour le rendre

hello.txt

Comment puis-je faire ceci?

name += ".txt" ne fonctionnera pas

35
user69514

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 string (should check the return value ...) */
strcpy(name_with_extension, name); /* copy name into the new var */
strcat(name_with_extension, extension); /* add the extension */
54
David Underhill

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 ajouter le modificateur const, selon que vous êtes plus intéressé par le nom de ou par la valeur de chaîne " bonjour ". Vous ne devriez pas essayer de modifier le littéral ("hello"), car de mauvaises choses peuvent arriver .

La principale chose à transmettre est que C n’a pas un type de chaîne approprié (ou 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ère de lire Tableaux de caractères , section 1.9 dans Le langage de programmation C (page 28 deuxième édition). Je recommande fortement de lire ce petit livre (<300 pages) pour apprendre le C.

En complément de votre question, les sections 6 - Tableaux et pointeurs et la section 8 - Caractères et chaînes de caractères de C FAQ pourraient vous aider. La question 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 vous souhaitez concaténer à l’aide de la fonction standard strcat (ou mieux encore strncat) de la bibliothèque C. Vous voudrez inclure le fichier d'en-tête string.h pour déclarer les déclarations de fonctions.

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

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

Copiez d'abord la chaîne actuelle 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" );
11
Salv0

asprintf n'est pas standard à 100%, mais il est disponible via les bibliothèques GNU et BSD standard C, vous l'avez donc probablement. Il alloue la sortie, vous n'avez donc pas rester assis et compter les personnages.

char *hi="Hello";
char *ext = ".txt";
char *cat;

asprintf(&cat, "%s%s", hi, ext);
5
bk.

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

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

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
}
1
DigitalRoss

Vous pouvez concaténer des chaînes en utilisant la fonction sprintf (). Dans votre cas, par exemple:

char file[80];
sprintf(file,"%s%s",name,extension);

Et vous finirez par avoir la chaîne concaténée dans "fichier".

0
CASO Student