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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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

  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
    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

  10. #10
    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

+ 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