Affecter une valeur à une chaîne de caractère

Résolu/Fermé
T-Monde99 - Modifié le 28 sept. 2022 à 11:17
[Dal] Messages postés 6155 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 27 novembre 2023 - 28 sept. 2022 à 12:56

Bonjour,

Je débute en langage en C et c'est mon premier devoir.

Je veux affecter la valeur "katie" à kid1 et la valeur "l'incroyable Hulk a hero3", puis les afficher; comme j'ai fait pour kid1 et kid2.

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

int main()
{
  char kid1[11];
  char kid2[] = "Maddie";
  char kid3[] = "Andrew";
  char Heros1[] = "Batman";
  char Heros2[] = "Spiderman";
  char Heros3[25];
  char "Katie", "L'incroyable Hulk";

  printf("Le héros préféré de %s est : %s\n", kid2, Heros2);
  printf("Le héros préféré de %s est : %s\n", kid3, Heros1);
  printf("Le héros préféré de %s est : %s\n", kid1, Heros3);

  return 0;
}
A voir également:

1 réponse

[Dal] Messages postés 6155 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 27 novembre 2023 1 073
Modifié le 28 sept. 2022 à 10:09

Bonjour T-Monde99,

En langage C, on peut affecter une chaîne de caractères à un tableau de char précédemment déclaré avec une taille suffisante, en utilisant la fonction standard strcpy() disponible avec l'entête <string.h>.

https://cplusplus.com/reference/cstring/strcpy/

Par exemple (exemple raccourci adapté du lien ci-dessus) :

/* strcpy example */
#include <stdio.h>
#include <string.h>

int main(void) {
  char str3[40];

  strcpy(str3, "copy successful");
  printf("str3 = %s\n", str3);

  return 0;
}

Dans ton code, ta ligne 18 ne compile pas avec le message d'erreur suivant (avec gcc) :

$ gcc -Wall -Wextra 37696118.c
37696118.c: In function ‘main’:
37696118.c:18:6: error: expected identifier or ‘(’ before string constant
 char "Katie", "L'incroyable Hulk";
      ^~~~~~~

Cette ligne ne signifie rien et n'est pas syntaxiquement correcte en C.

1
mamiemando Messages postés 32786 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 3 décembre 2023 7 685
Modifié le 28 sept. 2022 à 11:16

Bonjour

Quelques précisions à la réponse de [Dal], déjà très complète :

  • Lorsque tu utilises strcpy, la zone dans laquelle tu fais la recopie doit être allouée au préalable, soit avec une allocation statique (comme [Dal] le propose, ligne 6), soit avec une allocation dynamique (malloc). Dans ton cas c'est bon car kid1 et hero3 (ou plutôt heros3) sont préallouées.
    • Tu peux aussi utiliser strncpy, qui prend en paramètre la taille de la zone destination et s'assure qu'on ne débordera pas de la zone destination. Plus de détails ici.
  • La zone allouée doit être suffisamment grande pour accueillir la chaîne et son caractère terminal \0. Par exemple, pour recopier la chaîne "toto", il faut que le zone dans laquelle on fait la recopie fasse au moins 4+1=5 octets, sinon, dans le cas général, cela fait une erreur de segmentation. Dans ton cas, tout va bien aussi car l'allocation faite pour ces deux variables est suffisamment grande pour y recopier les valeurs souhaitées.
  • Par convention, on écrit généralement en C les noms de variables sont en écrits minuscules (par exemple ma_variable).
  • Je t'invite également à soigner l'orthographe et l'indentation de ton programme (corrigées dans le message initial).
  • Il est plus rigoureux de déclarer les chaînes constantes avec le type const char [] ou const char * 
#include <stdio.h>
#include <string.h>

int main() {
    char kid1[11];
    const char * kid2 = "Maddie";
    const char * kid3 = "Andrew";
    const char * heros1 = "Batman";
    const char * heros2 = "Spiderman";
    char heros3[25];

    const char * k1 = "Katie";
    const char * h3 = "L'incroyable Hulk";
    strcpy(kid1, k1);   // ou bien : strncpy(kid1, k1, sizeof(kid1));
    strcpy(heros3, h3); // ou bien : strncpy(heros3, h3, sizeof(heros3));

    printf("Le héros préféré de %s est : %s\n", kid1, heros1);
    printf("Le héros préféré de %s est : %s\n", kid2, heros2);
    printf("Le héros préféré de %s est : %s\n", kid3, heros3);
    return 0;
}

Bonne chance

0
[Dal] Messages postés 6155 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 27 novembre 2023 1 073 > mamiemando Messages postés 32786 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 3 décembre 2023
Modifié le 28 sept. 2022 à 13:54

Salut mamiemando et T-Monde99,

@mamiemando:

Comme T-Monde99 indique être très débutant (son premier devoir), il est peut être prématuré de lui parler de malloc() et de lui présenter comment déclarer un pointeur sur une chaîne littérale avec la forme

const char * heros1 = "Batman";

@T-Monde99:

mamiemando te montre une façon alternative de déclarer et initialiser à la déclaration des chaînes lorsqu'elles sont constantes, c'est à dire que le programme ne sera pas amené à les modifier. Avec cette forme, une erreur à l'exécution se produira certainement si, dans ton code, tu décides finalement, à l'exécution, que heros1 doit contenir "Robin" à la place de "Batman" et que tu tentes d'y stocker cette chaîne avec strcpy(). Le compilateur gcc génère aussi dans ce cas un avertissement mais pas une erreur (le programme est compilé, ce qui ne veut pas dire qu'il est "bon").

La déclaration en tant que tableau de char que tu avais faite est tout à fait valable (et correspond sans doutes à ce qu'on t'a appris à ce stade) :

char Heros1[] = "Batman";

Elle te permet de modifier le contenu du tableau à l'exécution, si nécessaire.

Une autre chose à bien comprendre est aussi ce que fait cette ligne. Elle est juste un moyen commode de déclarer un tableau de dimension 7 et d'initialiser sur la même ligne de code ce tableau avec les 6 char composant ce qui suit le signe égal en terminant le tableau avec le char terminateur '\0'.

Cela est exactement équivalent à :

char Heros1[7] = { 'B', 'a', 't', 'm', 'a', 'n', '\0' };

Sauf que l'écriture est raccourcie avec la syntaxe permise par le C pour faciliter la déclaration et initialisation (toutes ces apostrophes, virgules et accolades n'étant pas pratiques à taper), le compilateur déterminant tout seul que le tableau doit avoir une taille de 7 char, et copiant les char en veillant à terminer la chaîne.

Note qu'un char est délimité par des apostrophes 'B' alors que "B", délimitée par des guillemets, représente une chaîne composée des char { 'B', '\0' }

Cela veux dire que tu peux écrire :

/* le type char permet de stocker un char (délimité par des ') */
char c = 'B';

/* le type char peut être utilisé pour déclarer un tableau de char
 * permettant de stocker une chaîne (guillemets) */
char st1[] = "Batman";

C'était un des nombreux problèmes dans ta ligne 18 de ton code d'origine. Outre le fait que tu ne déclarais pas d'identifiant de variable, l'absence de =, ..., ton type n'était, de toutes façons pas bon, car un (seul) char ne peut pas contenir une chaîne (usage des guillemets).

0