Contenu | Rechercher | Menus

Annonce

La nouvelle clé USB Ubuntu-fr est en prévente
Rendez-vous sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/08/2019, à 16: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" smile
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, à 16: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, à 16:27)

Hors ligne

#3 Le 26/08/2019, à 18: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, à 18: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, à 19: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, à 19:18

NicoApi73

Re : Tableau et structure (C)

pingouinux a écrit :

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 wink

Dernière modification par NicoApi73 (Le 26/08/2019, à 19:49)

Hors ligne

#7 Le 26/08/2019, à 19:48

pingouinux

Re : Tableau et structure (C)

Exact : L ≥ longueur_de_la_plus_grande_chaîne + 1

Hors ligne

#8 Le 26/08/2019, à 20: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, à 20: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, à 20:49

NicoApi73

Re : Tableau et structure (C)

En complément de ce qu'a écrit pingouinux :

man strcpy

Hors ligne