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
Bonjour à tous je cherche une réponse à ma question si quelqu'un sait, j'ai ce code basique :

char prenom[100 ] = "bob";
printf("%s", prenom);

char prenom2[ 100];
prenom2[ 100] = "john";
printf("%s", prenom2);

le premier tableau m'affiche bien bob mais le second m'affiche des caractères incorrects. Où c'est que je merde ? Si quelqu'un sait m'aider je le remercie

PS : d'après ce que j'ai compris le deuxième tableau a été déclaré mais il ne lui est pas affecté la valeur que je veux et ce sont des valeurs déjà présente dans la mémoire qui sont lues à la place
A voir également:

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
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
0
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:33
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.
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,
0
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
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,
0
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
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
0
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
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,
0

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
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
0
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
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.
0
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
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 !
0