Pages : 1
#1 Le 26/08/2019, à 15:06
- chris7522
Tableau et structure (C)
Bonjour a toutes et a tous ,
Apres avoir passé une bonne partie de la matinée sur ce petit bout de code , je sollicite votre aide . Je me suis inspiré d'un exemple mais j'ai l'impression que cela ne se fait plus ou alors , comme d'habitude , j'ai oublié un truc super evident et je vais me faire "descendre"
Voici le code :
#include <stdio.h>
#include <stdlib.h>
int main(void){
typedef struct FAMILLE FAMILLE;
struct FAMILLE{
int age;
char prenom="";
char surnom="";
};
FAMILLE menbre[3];
menbre[0].age=18;
menbre[0].prenom="perlanti";
menbre[0].surnom="perli";
menbre[1].age=22;
menbre[1].prenom="mallory";
menbre[1].surnom="mallo";
menbre[2].age=21;
menbre[2].prenom="lauralee";
menbre[2].surnom="lalee";
printf("le surnom de lauralee est:%s\n",menbre[2].surnom);
return 0;
}
Hors ligne
#2 Le 26/08/2019, à 15:24
- NicoApi73
Re : Tableau et structure (C)
Bonjour,
char prenom
est une déclaration pour 1 caractère et non pas pour une chaine.
Tu ne peux pas faire
menbre[0].prenom="perlanti"
- Premièrement tu essaies d'allouer une chaine de caractère sur une variable qui n'en gère qu'un seul
- Deuxièmement, la gestion des chaines de caractères se fait par des fonctions spécifiques (strcpy, strncpy...)
EDIT : et de mémoire, tu ne peux pas donner de valeur par défaut dans une déclaration de structure
Dernière modification par NicoApi73 (Le 26/08/2019, à 15:27)
Hors ligne
#3 Le 26/08/2019, à 17:25
- chris7522
Re : Tableau et structure (C)
Ok merci de ton aide . Alors , peut etre faire de cette facon :
#include <string.h>
#include <stdio.h>
int main(void){
typedef struct FAMILLE FAMILLE;
struct FAMILLE{
int age;
char prenom[20];
char surnom[20];
};
FAMILLE menbre[3];
strcpy(menbre[2].surnom,"lalee");
printf("le surnom de lauralee est:%s\n",menbre[2].surnom);
return 0;
}
Hors ligne
#4 Le 26/08/2019, à 17:28
- NicoApi73
Re : Tableau et structure (C)
Exact. Faire attention à la taille de la chaîne de caractères car tu peux faire un débordement de tampon sans aucun warning...
Hors ligne
#5 Le 26/08/2019, à 18:01
- pingouinux
Re : Tableau et structure (C)
Bonsoir,
Pour éviter les débordements, tu peux utiliser strncpy au lieu de strcpy.
#include <string.h>
#include <stdio.h>
#define L 20
int main(void){
typedef struct FAMILLE FAMILLE;
struct FAMILLE{
int age;
char prenom[L];
char surnom[L];
};
FAMILLE menbre[3];
strncpy(menbre[2].surnom,"lalee",L);
printf("le surnom de lauralee est:%s\n",menbre[2].surnom);
return 0;
}
Hors ligne
#6 Le 26/08/2019, à 18:18
- NicoApi73
Re : Tableau et structure (C)
Bonsoir,
Pour éviter les débordements, tu peux utiliser strncpy au lieu de strcpy.
Yep, par contre il faut gérer le caractère nul \0
Dernière modification par NicoApi73 (Le 26/08/2019, à 18:49)
Hors ligne
#7 Le 26/08/2019, à 18:48
- pingouinux
Re : Tableau et structure (C)
Exact : L ≥ longueur_de_la_plus_grande_chaîne + 1
Hors ligne
#8 Le 26/08/2019, à 19:14
- chris7522
Re : Tableau et structure (C)
Merci a tous les deux .
pingouinux :
Je ne saisis pas trop la nuance entre les 2 fonctions strcpy et strncpy . Je ne vois pas pourquoi la 2 eme fonction est plus sécurisé , tu utilises un define L 20 donc ca reviens un peu au meme non ?
A je commence un peu a comprendre : Tu prends la longueur de la chaine la +longue +1 pour le caractere de fin , comme ca pas de buffer overflow possible .
Hors ligne
#9 Le 26/08/2019, à 19:27
- pingouinux
Re : Tableau et structure (C)
char *strncpy(char *dest, const char *src, size_t n);
strncpy ne copiera pas plus de n bytes.
Hors ligne
#10 Le 26/08/2019, à 19:49
- NicoApi73
Re : Tableau et structure (C)
En complément de ce qu'a écrit pingouinux :
man strcpy
Hors ligne
Pages : 1