Structure tableau
Résolu/Fermé
anthony
-
17 janv. 2010 à 21:26
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 - 20 janv. 2010 à 01:17
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 - 20 janv. 2010 à 01:17
A voir également:
- Structure tableau
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Trier tableau excel - Guide
- Impossible d'afficher le rapport de tableau croisé dynamique sur un rapport existant ✓ - Forum Excel
3 réponses
diocool
Messages postés
367
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
21 octobre 2010
12
18 janv. 2010 à 02:22
18 janv. 2010 à 02:22
Bonsoir.
L'erreur c'est à l'affichage:
/* boucle pour afficher contacte */
for(i = 0; i < 2; i++)
{
printf("Nom : %s%s", list[i].nom[i], list[i].prenom[i]);
printf("\tTelephone : %s\n", list[i].phone[i]);
}
Tu as ajouté des "[i]" là où il ne fallait pas.
Il faut donc ça:
for(i = 0; i < 2; i++)
{
printf("Nom : %s %s", list[i].nom, list[i].prenom);
printf("\tTelephone : %s\n", list[i].phone);
}
L'erreur c'est à l'affichage:
/* boucle pour afficher contacte */
for(i = 0; i < 2; i++)
{
printf("Nom : %s%s", list[i].nom[i], list[i].prenom[i]);
printf("\tTelephone : %s\n", list[i].phone[i]);
}
Tu as ajouté des "[i]" là où il ne fallait pas.
Il faut donc ça:
for(i = 0; i < 2; i++)
{
printf("Nom : %s %s", list[i].nom, list[i].prenom);
printf("\tTelephone : %s\n", list[i].phone);
}
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
18 janv. 2010 à 21:57
18 janv. 2010 à 21:57
Oui, l'erreur vient belle et bien de l'affichage. Tu mets %s alors que l'argument est un char. Ton compilateur devrait te le signaler en tant que warning, d'ailleurs.
De plus, le prototype de main sans argument est : int main (void)
Et enfin, fgets(list[i].nom[i], MAX, stdin); est très bien. Mais il ne faut pas oublier de vider le buffer clavier après. Si l'utilisateur rentre une chaîne trop grande, le deuxième fgets prendra la fin de la précédente chaîne...
Cdlt,
De plus, le prototype de main sans argument est : int main (void)
Et enfin, fgets(list[i].nom[i], MAX, stdin); est très bien. Mais il ne faut pas oublier de vider le buffer clavier après. Si l'utilisateur rentre une chaîne trop grande, le deuxième fgets prendra la fin de la précédente chaîne...
Cdlt,
oui mais je croyait que pour afficher une chaine il faut mettre %s ici je veux afficher la structure list ou cette structure contient un sous tableau prenom, nom et phone de type char donc pour afficher la chaine de nom, prenom, phone on va utiliser %s donc pour afficher par exemple le tableau phone on va mettre
for(i=0; i < 2; i++)
printf("%s", list[i].phone[i]);
je vois pas ou est le problème dans ce code
for(i=0; i < 2; i++)
printf("%s", list[i].phone[i]);
je vois pas ou est le problème dans ce code
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
>
anthony
18 janv. 2010 à 22:19
18 janv. 2010 à 22:19
list[i] est une structure. list[i].nom est de type char[MAX]. Soit un tableau de caractères de MAX éléments.
Si tu fais list[i].nom[i] tu vas pointer sur un caractère dans le tableau. Pour afficher un caractère, c'est possible, il faut utiliser %c.
Or, toi tu souhaites afficher la chaine de caractères. Il faut donc mettre list[i].nom. Ainsi dans ta fonction printf, list[i].nom se transformera en un pointeur sur l'adresse du premier caractère du tableau et affichera successivement tous les caractères jusqu'au '\0' final.
Cdlt,
Si tu fais list[i].nom[i] tu vas pointer sur un caractère dans le tableau. Pour afficher un caractère, c'est possible, il faut utiliser %c.
Or, toi tu souhaites afficher la chaine de caractères. Il faut donc mettre list[i].nom. Ainsi dans ta fonction printf, list[i].nom se transformera en un pointeur sur l'adresse du premier caractère du tableau et affichera successivement tous les caractères jusqu'au '\0' final.
Cdlt,
anthony
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
18 janv. 2010 à 22:54
18 janv. 2010 à 22:54
ah oui je comprend mais j'ai encore une autre petite question car je crois que j'ai encore des doutes pour les tableaux:
Bon alors dans les fonction standart pour afficher les valeur il faut mettre l'opérateur * ou [] mais pour afficher uen chaine il faut juste le tableau
printf("%s", tableau);
mais normalement si je suis bien les lecon sa devrait m'afficher les adresse du tableau ?
Bon alors dans les fonction standart pour afficher les valeur il faut mettre l'opérateur * ou [] mais pour afficher uen chaine il faut juste le tableau
printf("%s", tableau);
mais normalement si je suis bien les lecon sa devrait m'afficher les adresse du tableau ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 841
>
anthony
18 janv. 2010 à 23:23
18 janv. 2010 à 23:23
mais normalement si je suis bien les lecon sa devrait m'afficher les adresse du tableau ?
printf("%s",tableau);
tableau renverra effectivement l'adresse du premier char dans le tableau. Mais comme le dit le man de printf pour le format s :
il faut mettre un pointeur sur un tableau de caractères, d'où tableau.
printf("%s",tableau);
tableau renverra effectivement l'adresse du premier char dans le tableau. Mais comme le dit le man de printf pour le format s :
S’il n’y a pas de modificateur l, l’argument de type const char* est supposé être un pointeur sur un tableau de caractères (pointeur sur une chaîne). Les caractères du tableau sont écrits jusqu’au caractère nul ’\0’ final, non compris.
il faut mettre un pointeur sur un tableau de caractères, d'où tableau.
anthony
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
19 janv. 2010 à 00:43
19 janv. 2010 à 00:43
ah ok et j'ai encore une question a te poser si le code aurais eu une nouvelle structure imbriqué qui s'appelle par exemple contacte et je doit afficher après tout ce que j'ai sauvegardé dans le tableaux
sa donnerais ceci
for(i=0; i < 2; i++)
printf("%s\t%s", contcate[i].list[i].prenom, contcate[i].list[i].nom);
est ce que j'ai juste ou je suis hors sujet ??
sa donnerais ceci
for(i=0; i < 2; i++)
printf("%s\t%s", contcate[i].list[i].prenom, contcate[i].list[i].nom);
est ce que j'ai juste ou je suis hors sujet ??
diocool
Messages postés
367
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
21 octobre 2010
12
20 janv. 2010 à 01:17
20 janv. 2010 à 01:17
De rien
18 janv. 2010 à 18:10
18 janv. 2010 à 21:42
nom[i] représente un caractère de cette chaine. Donc ça râle avec le %s : le programme s'attend à avoir un chaine, pas un caractère.
Et de toute façon, comme tu l'avais écrit ça aurait voulu dire : pour le premier enregistrement, écrire le premier caractère du nom, etc... . Pour le deuxième enregistrement, écrire le deuxième caractère du nom, etc... et ainsi de suite, ce qui n'est certainement pas ce que tu souhaites faire.