Affecter une valeur à un tableau char déclaré
Résolu/Fermé
lemoinau
Messages postés
4
Date d'inscription
mercredi 6 août 2014
Statut
Membre
Dernière intervention
6 août 2014
-
6 août 2014 à 21:20
lemoinau Messages postés 4 Date d'inscription mercredi 6 août 2014 Statut Membre Dernière intervention 6 août 2014 - 6 août 2014 à 23:23
lemoinau Messages postés 4 Date d'inscription mercredi 6 août 2014 Statut Membre Dernière intervention 6 août 2014 - 6 août 2014 à 23:23
A voir également:
- Affecter une valeur à un tableau char déclaré
- Tableau word - Guide
- Code ascii tableau - Guide
- Tableau croisé dynamique - Guide
- Trier un tableau excel - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
6 réponses
BioK03
Messages postés
655
Date d'inscription
mardi 15 avril 2014
Statut
Membre
Dernière intervention
24 décembre 2016
132
6 août 2014 à 21:57
6 août 2014 à 21:57
Bonjour,
En faisant 'char prenom2[ 100]; ', vous réservez l'espace d'un pointeur sur un tableau de 100 caractères (si vous ne savez pas ce qu'est un pointeur, allez jetez un oeil), mais vous ne réservez pas le tableau.
Pour le réserver ensuite, vous pouvez faire : prenom2 = malloc(100*sizeof(char));
Ainsi, vous ferez pointer prenom 2 sur le tableau ainis déclaré.
Important : à la fin de la programmation, il est important de libérer l'espace alloué avec 'free prénom2; '.
Cordialement
En faisant 'char prenom2[ 100]; ', vous réservez l'espace d'un pointeur sur un tableau de 100 caractères (si vous ne savez pas ce qu'est un pointeur, allez jetez un oeil), mais vous ne réservez pas le tableau.
Pour le réserver ensuite, vous pouvez faire : prenom2 = malloc(100*sizeof(char));
Ainsi, vous ferez pointer prenom 2 sur le tableau ainis déclaré.
Important : à la fin de la programmation, il est important de libérer l'espace alloué avec 'free prénom2; '.
Cordialement
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
6 août 2014 à 22:00
6 août 2014 à 22:00
Bonjour,
Oui ton explication est la bonne.
prenom2[ 100] = "john";
Ton compilateur doit gueuler normalement. Cela comporte 3 erreurs :
1/ prenom2[100] est une case qui n'existe pas car le dernier élément du tableau est prenom2[99].
2/ prenom[100] est de type char, et "john" de type char*. Tu ne peux donc pas faire une affectation ainsi.
3/ Pour copier des valeurs dans un tableau, il faut utiliser strcpy (ou strncpy). Par exemple : strcpy(prenom2, "john");
char prenom1[100]="john";
Cela revient à faire : char prenom1[100]={'j', 'o', 'h', 'n', '\0'};
Cdlt,
Oui ton explication est la bonne.
prenom2[ 100] = "john";
Ton compilateur doit gueuler normalement. Cela comporte 3 erreurs :
1/ prenom2[100] est une case qui n'existe pas car le dernier élément du tableau est prenom2[99].
2/ prenom[100] est de type char, et "john" de type char*. Tu ne peux donc pas faire une affectation ainsi.
3/ Pour copier des valeurs dans un tableau, il faut utiliser strcpy (ou strncpy). Par exemple : strcpy(prenom2, "john");
char prenom1[100]="john";
Cela revient à faire : char prenom1[100]={'j', 'o', 'h', 'n', '\0'};
Cdlt,
lemoinau
Messages postés
4
Date d'inscription
mercredi 6 août 2014
Statut
Membre
Dernière intervention
6 août 2014
6 août 2014 à 22:18
6 août 2014 à 22:18
Merci infiniment pour vos réponses, j'ai rien pigé mais je sais où chercher maintenant ^.^
Sinon le but de mon "programme" était de créer une variable de type char dans une structure (pour un carnet d'adresse par exemple) et pouvoir ensuite définir le prenom de chaque personne grâce à ma structure, j'avais oublié de préciser
Sinon le but de mon "programme" était de créer une variable de type char dans une structure (pour un carnet d'adresse par exemple) et pouvoir ensuite définir le prenom de chaque personne grâce à ma structure, j'avais oublié de préciser
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
6 août 2014 à 22:31
6 août 2014 à 22:31
Que n'as-tu pas compris ?
Sinon le but de mon "programme" était de créer une variable de type char dans une structure (pour un carnet d'adresse par exemple) et pouvoir ensuite définir le prenom de chaque personne grâce à ma structure
Oui, dans ce cas, utilise strcpy() comme dans mon exemple. Ca fonctionnera très bien.
Cdlt,
Sinon le but de mon "programme" était de créer une variable de type char dans une structure (pour un carnet d'adresse par exemple) et pouvoir ensuite définir le prenom de chaque personne grâce à ma structure
Oui, dans ce cas, utilise strcpy() comme dans mon exemple. Ca fonctionnera très bien.
Cdlt,
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lemoinau
Messages postés
4
Date d'inscription
mercredi 6 août 2014
Statut
Membre
Dernière intervention
6 août 2014
Modifié par lemoinau le 6/08/2014 à 23:06
Modifié par lemoinau le 6/08/2014 à 23:06
Pour commencer je réponds à vos réponses ^^
"1/ prenom2[100] est une case qui n'existe pas car le dernier élément du tableau est prenom2[99]. "
ça c'est OK mais je pensais que ce code
char prenom[100 ] = "bob";
printf("%s", prenom);
était identique à
char prenom2[ 100];
prenom2[ 100] = "john";
printf("%s", prenom2);
alors que si j'ai bien compris, dans ce dernier code je tente d'affecter la chaine de caractère "john" à la dernière cellule du tableau (qui normalement vaut \0) c'est ça ?
"2/ prenom[100] est de type char, et "john" de type char*. Tu ne peux donc pas faire une affectation ainsi. "
Je n'ai pas encore tout compris avec les pointeurs je suis en train de regarder là et c'est un peu confus
"3/ Pour copier des valeurs dans un tableau, il faut utiliser strcpy (ou strncpy). Par exemple : strcpy(prenom2, "john"); "
Suis-je forcément obligé de passer par une copie, ne puis-je pas directement affecter une valeur au tableau char après l'avoir initialisé ? Car si par exemple dans mon carnet d'adresse, j'ai créé la structure Carnet qui contient nom et prenom, pourquoi ne puis-je pas faire
struct Carnet personne1;
personne1.nom = "john";
personne1.prenom ="bob";
Si je veux utiliser strcpy je dois créer une nouvelle variable, lui affecter une nouvelle valeur pour ensuite la copier dans personne1.nom, ça fait un peu lourd non ?
De plus je vois que quand je fais pour :
char prenom2[100];
scanf("%s", prenom2);
Il m'enregistre la valeur directement, comment cela fonctionne t'il, il fait une copie de la chaine comme vous le suggerez ?
Merci pour votre aide
"1/ prenom2[100] est une case qui n'existe pas car le dernier élément du tableau est prenom2[99]. "
ça c'est OK mais je pensais que ce code
char prenom[100 ] = "bob";
printf("%s", prenom);
était identique à
char prenom2[ 100];
prenom2[ 100] = "john";
printf("%s", prenom2);
alors que si j'ai bien compris, dans ce dernier code je tente d'affecter la chaine de caractère "john" à la dernière cellule du tableau (qui normalement vaut \0) c'est ça ?
"2/ prenom[100] est de type char, et "john" de type char*. Tu ne peux donc pas faire une affectation ainsi. "
Je n'ai pas encore tout compris avec les pointeurs je suis en train de regarder là et c'est un peu confus
"3/ Pour copier des valeurs dans un tableau, il faut utiliser strcpy (ou strncpy). Par exemple : strcpy(prenom2, "john"); "
Suis-je forcément obligé de passer par une copie, ne puis-je pas directement affecter une valeur au tableau char après l'avoir initialisé ? Car si par exemple dans mon carnet d'adresse, j'ai créé la structure Carnet qui contient nom et prenom, pourquoi ne puis-je pas faire
struct Carnet personne1;
personne1.nom = "john";
personne1.prenom ="bob";
Si je veux utiliser strcpy je dois créer une nouvelle variable, lui affecter une nouvelle valeur pour ensuite la copier dans personne1.nom, ça fait un peu lourd non ?
De plus je vois que quand je fais pour :
char prenom2[100];
scanf("%s", prenom2);
Il m'enregistre la valeur directement, comment cela fonctionne t'il, il fait une copie de la chaine comme vous le suggerez ?
Merci pour votre aide
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
6 août 2014 à 23:02
6 août 2014 à 23:02
1/
alors que si j'ai bien compris, dans ce dernier code je tente d'affecter la chaine de caractère "john" à la dernière cellule du tableau (qui normalement vaut \0) c'est ça ?
C'est exactement ça. Mais prenom2[100] n'est pas la dernière, elle n'existe pas. La dernière est prenom2[99]. char prenom2[100]; déclare 100 char dans le tableau : la première étant prenom2[0];
2/ Oui, c'est pas facile quand on débute ces notions.
Grosso modo, tu as d'un côté prenom2[x] qui est un caractère et "john" qui est une chaîne de caractère. Ce ne sont pas les mêmes types. Donc, pas de chance que ça marche.
3/
Suis-je forcément obligé de passer par une copie
Oui forcément. Ce qu'il faut voir, c'est qu'il n'y a pas de magie en C.
prenom2 est un tableau. Si tu souhaites copier, "john", il faut bien préciser que le 'j' ira dans prenom2[0], le 'o' dans prenom2[1], etc. Si tu fais prenom2="john" (syntaxiquement c'est ok), ça sera faux. J'explique pas trop cette partie, car il faut que tu maîtrises les pointeurs avant.
Il m'enregistre la valeur directement, comment cela fonctionne t'il, il fait une copie de la chaine comme vous le suggerez ?
Dans le scanf(), tu utilises "%s" qui indiques à la fonction qu'il s'agit d'une chaîne de caractère. Il s'occupe donc de la copier comme il faut.
D'ailleurs, si tu ne veux pas utiliser strcpy(), tu peux utiliser sprintf(prenom2, "%s", "john"); Cela affiche "john" dans la chaîne prenom2. Là encore, c'est le "%s" qui fait la différence.
alors que si j'ai bien compris, dans ce dernier code je tente d'affecter la chaine de caractère "john" à la dernière cellule du tableau (qui normalement vaut \0) c'est ça ?
C'est exactement ça. Mais prenom2[100] n'est pas la dernière, elle n'existe pas. La dernière est prenom2[99]. char prenom2[100]; déclare 100 char dans le tableau : la première étant prenom2[0];
2/ Oui, c'est pas facile quand on débute ces notions.
Grosso modo, tu as d'un côté prenom2[x] qui est un caractère et "john" qui est une chaîne de caractère. Ce ne sont pas les mêmes types. Donc, pas de chance que ça marche.
3/
Suis-je forcément obligé de passer par une copie
Oui forcément. Ce qu'il faut voir, c'est qu'il n'y a pas de magie en C.
prenom2 est un tableau. Si tu souhaites copier, "john", il faut bien préciser que le 'j' ira dans prenom2[0], le 'o' dans prenom2[1], etc. Si tu fais prenom2="john" (syntaxiquement c'est ok), ça sera faux. J'explique pas trop cette partie, car il faut que tu maîtrises les pointeurs avant.
Il m'enregistre la valeur directement, comment cela fonctionne t'il, il fait une copie de la chaine comme vous le suggerez ?
Dans le scanf(), tu utilises "%s" qui indiques à la fonction qu'il s'agit d'une chaîne de caractère. Il s'occupe donc de la copier comme il faut.
D'ailleurs, si tu ne veux pas utiliser strcpy(), tu peux utiliser sprintf(prenom2, "%s", "john"); Cela affiche "john" dans la chaîne prenom2. Là encore, c'est le "%s" qui fait la différence.
lemoinau
Messages postés
4
Date d'inscription
mercredi 6 août 2014
Statut
Membre
Dernière intervention
6 août 2014
6 août 2014 à 23:23
6 août 2014 à 23:23
Aah bah sprinf convient parfaitement ça va beaucoup mieux avec cela
et en effet en y repensant
char prenom[100];
prenom[100] = "john";
était forcément erroné je regrette d'avoir fait cette erreur de logique
en tout cas merci d'avoir pris un peu de votre temps pour m'aider, merci beaucoup !
et en effet en y repensant
char prenom[100];
prenom[100] = "john";
était forcément erroné je regrette d'avoir fait cette erreur de logique
en tout cas merci d'avoir pris un peu de votre temps pour m'aider, merci beaucoup !
6 août 2014 à 22:33
Faux. En faisant ça, il réserve bien un tableau de 100 caractères. Attention à ne pas confondre un tableau et un pointeur. La frontière est très mince mais elle existe.
Pour le réserver ensuite, vous pouvez faire : prenom2 = malloc(100*sizeof(char));
Cela ne se fait que s'il s'agit d'un pointeur. Par exemple : char *prenom2; sinon, il ne faut surtout pas faire ça...
Cdlt,