IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

probleme avec strncpy


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 101
    Par défaut probleme avec strncpy
    bonjour

    quelqu'un pourrais me dire pourquoi mon appli plante quand j'utilise strncpy
    avec un exemple de mon erreur pour une meilleur comprehension
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    	FILE *fptr;
    	fptr = fopen(Chdata,"r");	// ouverture du fichier
    	if (fptr != NULL)
    	{
    		char ligne[100];
    		while (fgets (ligne, sizeof ligne, fptr) != NULL)
    		{
    			char *controlstr;
    			char *valeurstr;			
    			size_t countstr = strlen(ligne);
    //			strncpy(controlstr,ligne,4);
    			char *refbox1 = "A001";
    			char *refbox2 = "B001";
    			if (controlstr != NULL)
    			{
    				if (strcmp(controlstr, refbox1) == 0)
    				{
    						gtk_combo_box_append_text(Box1data, ligne);
    				}
    				if (strcmp(controlstr, refbox2) == 0)
    				{
    						gtk_combo_box_append_text(Box2data, ligne);
    				}
    			}
    		}
    		fclose(fptr);	// fermeture du fichier
    	}
    merci

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    tout simplement parce que "controlstr" est un pointeur non initialisé qui pointe sur rien....
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 101
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    tout simplement parce que "controlstr" est un pointeur non initialisé qui pointe sur rien....
    la j'ai besoin d'explication ?

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    si je comprend bien, tu utilises des fonctions dont tu ne comprends pas les types de données mis en jeu...

    Je te conseille de relire des cours, tuto, bouquin sur le C et particulièrement le concept de chaines de caractères et de pointeur en C.

    au lieu de t'expliquer ici ces concepts la, regarde la faq C, les cours et tutos de la rubrique C, ca y seront mieux expliqué que ce que je peux faire en 3 lignes...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 101
    Par défaut
    j'ai deja lu la faq et les tutos, mais il ya quelque qui m'echappe

  6. #6
    Futur Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Par défaut
    Bon en 3 lignes on peut tout de meme dire :
    Pour pouvoir copier les 4 premiers caracteres de "ligne" a l'adresse pointée par "controlstr" il est necessaire de reserver un espace mémoire :
    au lieu de
    char *controlstr;

    reservez un espace mémoire
    char controlstr[5] ;
    ou
    char *controlstr;
    controlstr=malloc(5);

    puis initialiser cet espace mémoire
    memset(controlstr,NULL,5);

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Le memset n'est plus utile dès l'instant où tu as initialisé soit un tableau, soit ton pointeur à l'aide de malloc.

    Il faudrait également expliquer pourquoi si on veut copier les 4 premiers caractères de "ligne" il faut réserver un tableau de 5 char.

    Cette réponse en plusieurs parties n'aidera pas forcément le PI, et je lui conseille également de relire la FAQ ou des tutoriels sur les chaînes de caractères et/ou les pointeurs.

    Mais pour faire court :
    Une chaîne de caractère doit se terminer par le caractère nul '\0'.

    Le man de strncpy nous dit :
    The strncpy() function is similar (to strcpy), except that not more than n bytes of src are copied. Thus, if there is no null byte among the first n bytes of src, the result will not be null-terminated.
    Le code à utiliser sera donc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char *controlstr = malloc (5 * sizeof(char)); //sizeof(char) toujours égal à 1
    // ou bien :
    // char controlstr[5];
     
    strncpy (controlstr, ligne, 4);
    controlstr[4] = '\0';
     
    /* traitement... */
     
    // si on a utilisé malloc :
    free (controlstr);

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 101
    Par défaut
    merci benoitra

    mon appli ne plante plus, mais maintenant je me retrouve avec 8 ou 9 caracteres dans "controlstr" ce qui rend la comparaison impossoble

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 101
    Par défaut
    Citation Envoyé par BSans Voir le message
    strncpy (controlstr, ligne, 4);
    controlstr[4] = '\0';

    [/code]
    le rajout de cette ligne fais plante mon appli ou n'affiche qu'une partie du contenu du fichier

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Il faudrait que tu repostes le code modifié.

    À quel moment survient ce plantage ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 101
    Par défaut
    Citation Envoyé par BSans Voir le message
    Il faudrait que tu repostes le code modifié.

    À quel moment survient ce plantage ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    controlstr[4] = '\0';

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 101
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     
    	FILE *fptr;
    	fptr = fopen(Chdata,"r");	// ouverture du fichier
    	if (fptr != NULL)
    	{
    		char ligne[100];
    		while (fgets (ligne, sizeof ligne, fptr) != NULL)
    		{
    			char controlstr[5];
    			char *valeurstr;			
    			size_t countstr = strlen(ligne);
    			strncpy(controlstr,ligne,4);
                            controlstr[4] = '\0';
    			char refbox1[5] = "A001"; // ici :aie:
    			char refbox2[5] = "B001"; // et ici :aie:
    			if (controlstr != NULL)
    			{
    				if (strcmp(controlstr, refbox1) == 0)
    				{
    						gtk_combo_box_append_text(Box1data, ligne);
    				}
    				if (strcmp(controlstr, refbox2) == 0)
    				{
    						gtk_combo_box_append_text(Box2data, ligne);
    				}
    			}
    		}
    		fclose(fptr);	// fermeture du fichier
    	}
    probleme resolu
    merci a vous

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Ok, donc le problème ne vient à priori pas de "controlstr[4] = '\0';", mais de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char refbox1[5] = "A001";
    char refbox2[5] = "B001";
    Ta précédente déclaration était bonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *refbox1 = "A001";
    char *refbox2 = "B001";
    Si tu veux passer par des tableaux, alors il faut utiliser cette déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char refbox1[5] = {'A','0','0','1','\0'};
    char refbox2[5] = {'B','0','0','1','\0'};

  14. #14
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par benoitra Voir le message
    puis initialiser cet espace mémoire
    memset(controlstr,NULL,5);
    0 mais certainement pas NULL. NULL n'a de sens que pour un pointeur.

    Et au passage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char controlstr[5] ;
    memset(controlstr,0,5);
    s'écrit plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char controlstr[5] = "" ;

  15. #15
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    @ BSans: Les 3 déclarations que tu as citées sont correctes. La première est équivalente à la dernière.

    La seconde est à éviter car tu fais pointer un pointeur sur une zone mémoire non modifiable. Si jamais tu essayes de modifier cette zone ton compilateur ne te dira rien mais tu auras un segfault à l'exécution.
    Si tu veux utiliser la deuxième déclaration il est mieux de déclarer tout ça en 'const'.


    @ lrgtk : Tu pourrais éviter l'appel à "controlstr[4] = '\0';" si tu avais initialisé ta variable au moment de la déclaration.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char controlstr[5] = "";
    Cette ligne est inutile car ton tableau est 'statique'. Ta condition sera toujours vraie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (controlstr != NULL)
    A quoi te sert la variable valeurstr ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme de recopie avec strncpy
    Par Ganondorf dans le forum Débuter
    Réponses: 10
    Dernier message: 27/09/2010, 04h32
  2. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo