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 :

La fonction Strncpy


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut La fonction Strncpy
    Salut a tous,
    au fait j'ai un problème qui peut paraitre banale pour beaucoup de personne mais pour moi il ne l'ai pas, donc je voulais exposer le problème pour prendre votre avis:
    voila j'ai donc deux chaine de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *inFile, *File;
    inFile = NULL;
    File = NULL;
    je veux copier les 45 premiers caracteres de inFile dans File avec strncpy mais le programme s'arrete subitement c'est que lorsque j'enleve l'instruction que tout devient normale

    strncpy (File,inFile,45);
    normalement l'instruction exacte de strncpy c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * strncpy ( char * destination, const char * source, size_t num );
    donc si le probleme arrive de const alors quelle fonction utiliser pour copier une chaine variable dans une autre chaine??? parce que la valeur de inFile change a chaque fois

    SVP aider moi a trouver ou est le problème
    et merci d'avance,

  2. #2
    Membre expérimenté Avatar de keikoz
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 146
    Par défaut
    Le problème n'est pas le const, le problème est plutot (je pense) que tu ne fais pas l'allocation de mémoire nécessaire à File*.

    N'oublie pas que là, tu ne déclares pas des tableaux de caractères, mais des pointeurs vers char (char *), ce qui n'est pas pareil. Si tu veux utiliser des pointeurs pour introduire une chaine de caractère, tu dois libérer de l'espace mémoire (pointé par ton pointeur). Pour pouvoir faire ce que tu veux faire tu devrais rajouter quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    File = malloc(sizeof(char) * 45)
    Et seulement ensuite faire ton strncpy.

    Tu veux pas nous montrer ton code complet ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    donc si le probleme arrive de const alors quelle fonction utiliser pour copier une chaine variable dans une autre chaine??? parce que la valeur de inFile change a chaque fois
    Le const devant le pointeur de la chaîne d'origine ne signifie pas que inFile n'a pas le droit de bouger. Il sert à garantir qu'il ne sera pas modifié à l'intérieur de la fonction strncpy.

    Sinon comme dit keikoz, le problème vient du fait que tu n'as pas alloué la chaîne. Attention toutefois : si tu veux 45 caractères et que tu en alloues 45, tu n'auras pas de zéro de fin de chaîne. Ca va bien tant que tu utilises des fonctions de manipulation de chaînes où l'on peu spécifier la taille. Mais si jamais tu as besoin d'utiliser strcpy, strcat... ces fonctions ont besoin de chaînes se terminant par un zéro.
    Pour ça il faut allouer 46 caractères, faire ton strncpy et mettre toi-même le zéro : File[45]=0;

    Ceci dit je sais pas si c'est parce que tu ne donnes pas tout le code, mais vu comme ça ton inFile en plus de ne pas être alloué ne contient rien.

  4. #4
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut
    Avant tout je tiens a vous remercier de vous être intéressé a mon problème,

    pour infile je ne peux pas spécifier la taille exacte par ce que ça peut être 45 comme ça peut être 60... etc
    c.a.d si je fais une allocation avec un nombre precis le programme risque de beuguer en cas ou l'utilisateur utilise un nom de fichier long ;
    moi je fais la simulation avec des fichiers précis, mais le programme doit au maximum approcher la réalité;
    enfin je vous donne mon programme et jugez par vous même
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    void main_sample(char option, long itemSize)
    {
        FILE *f = NULL; 
        char *inFile, *outFile;
        char encode; 
        long lSize1; 
        char *InFile;
        /* initialize data */
        inFile = NULL;
        outFile = NULL;
        InFile = NULL;
        encode = TRUE;
    	if (option == 'c'){ encode = TRUE;}/* compression mode */
    	if (option == 'd'){ encode = FALSE;}/* decompression mode */
     
        /* we have valid parameters encode or decode */
        outFile = "C:\\glomosim\\glomosim\\application\\Lzw.txt";
        if (encode)
        {
    		switch (itemSize)
    		{
    case 1000: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1000\\mball11.gif"; break;
    case 1075: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1075 BMP\\compat.bmp"; break;
    case 1146: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1146 exe\\vwipxspx.exe"; break;
    case 1311: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1311 BMP\\SAVE.bmp"; break;
    case 1460: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1460 TXT\\LICENSE.txt"; break;
    case 1832: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1832\\IULogo.gif"; break;
    case 1987: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1987\\HELPUS.txt"; break;
    case 2048: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\2048 TXT\\Gllomo.txt"; break;
     
    default: printf("\nThe itemsize is not specified\n"); break;// 10 fichier
    		}
    /*dans le switch le contenu de inFile varie*/
    		pch = strchr(inFile, '.');/*je sauvegarde l'extension du fichier*/
    		LZWEncodeFile(inFile, outFile);
        }
        else
        {
    		inFile = "C:\\glomosim\\glomosim\\application\\out";
                    strncpy (InFile,inFile,41);/**je prend 41 carcateres/
                    strcat(InFile, cpt);
                    cptint = atoi(cpt);cptint=cptint+1;
                    itoa (cptint,cpt,10);/*j'ajoute le compteur*/
    		strcat(InFile, pch);/*j'ajoute l'extension*/
     
    		LZWDecodeFile(outFile, InFile);
        }
        free(inFile); free(InFile); free(outFile);
    }
    Au fait j'ai utilisé strncpy parce qu'à chaque fois le contenu de inFile ne s'effaçait pas! du coup après plusieurs tentative pour trouver ou est le problème, j'ai essayer d'accomoder des solutions selon les exigences de mon programme, je sais c'est pas une solution mais je voulais seulement voir les resultats de ma simulation
    Mon problème de base est que j'ai plusieurs fichiers qui vont être compressés tour a tour et leurs résultats vont être stockés dans d'autre fichiers OUT:
    normalement je devrais avoir out1, out2, out3....
    mais j'obtient toujours
    out1
    out1.txt2
    out1.txt2.txt3
    et pourtant a chaque fois que la fonction est appelé inFile reçoit NULL et il est libéré après utilisation!!!
    meme strcpy ne marche pas avec moi??

    PS: j'utilise visual c++ 6 , peut être que cette information vous aidera à mieux cerner le problème parce que j'ai vu de toutes les couleurs avec ce compilateur
    et merci a vous.

  5. #5
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Code nawal.02 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *inFile, *outFile;
    <...>
    char *InFile;
    - Tu manques d'imagination à ce point.

    Code nawal.02 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char encode;
    <...>
    if (option == 'c'){ encode = TRUE;}/* compression mode */
    if (option == 'd'){ encode = FALSE;}/* decompression mode */
    <...>
    if (encode)
    <...>
    }
    else
    {
    - Si option est différente à la fois de 'c' et de 'd', encode ne seras pas initialisée ce qui risque de fausser le test qui suit.

    Code nawal.02 : Sélectionner tout - Visualiser dans une fenêtre à part
    pch = strchr(inFile, '.');/*je sauvegarde l'extension du fichier*/
    - Dans ce cas c'est le dernier point que tu dois chercher, strrchar()

    Code nawal.02 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    InFile = NULL;
    <...>
    inFile = "C:\\glomosim\\glomosim\\application\\out";
    strncpy (InFile,inFile,41);/**je prend 41 carcateres/
    - Attention InFile ne pointe pas vers une zone mémoire valide, documentes toi sur ce qu'est «l'allocation dynamique de mémoire».

    Code nawal.02 : Sélectionner tout - Visualiser dans une fenêtre à part
    free(inFile); free(InFile); free(outFile);
    - Revoir le point précédent.

    Bon courage.

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut
    salut,
    Citation Envoyé par ssmario2 Voir le message
    - Tu manques d'imagination à ce point.
    - Oui c'est vrais c'est résolu, merci pour la remarque.
    Citation Envoyé par ssmario2 Voir le message
    - Si option est différente à la fois de 'c' et de 'd', encode ne seras pas initialisée ce qui risque de fausser le test qui suit.
    - le traitement je le fais dans une autre fonction.
    Citation Envoyé par ssmario2 Voir le message
    - Dans ce cas c'est le dernier point que tu dois chercher, strrchar()
    merci pour l'idée, ça m'a échappée.
    Citation Envoyé par ssmario2 Voir le message
    - Attention InFile ne pointe pas vers une zone mémoire valide, documentes toi sur ce qu'est «l'allocation dynamique de mémoire».
    - j'ai fait des modification sur le code, et strncpy marche trés bien c'est vrais je ne lui allouais pas d'espace mémoire, mais j'ai un problème malgrés que je libère la mémoire avec free, inFile garde toujours son contenu,
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    void main_sample(char option, long itemSize)
    {
        char *inFile, *outFile = NULL;/*ici inFile est égale a NULL*/
        :
        :
        inFile = malloc (sizeof(char));
        outFile = malloc (sizeof(char));
     
     
        if ( inFile == NULL )
    	{
    		fprintf(stderr,"Cannot alloc memory for inFile \n");
    		exit(EXIT_FAILURE);
    	}
            if ( outFile == NULL )
    	{
    		fprintf(stderr,"Cannot alloc memory for inFile \n");
    		exit(EXIT_FAILURE);
    	}
     
    	:
            :
        if (encode)
        {
    		switch (itemSize)
    		{
    			case 1000: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1000\\mball11.gif"; break;
    			case 1075: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1075 BMP\\compat.bmp"; break;
    			case 1146: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1146 exe\\vwipxspx.exe"; break;
    			case 1311: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1311 BMP\\SAVE.bmp"; break;
    			case 1460: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1460 TXT\\LICENSE.txt"; break;
    			case 1832: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1832\\IULogo.gif"; break;
    			case 1987: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\1987\\HELPUS.txt"; break;
    			case 2048: inFile= "C:\\Users\\Nawal\\Desktop\\Exemple de simulation\\2048 TXT\\Gllomo.txt"; break;
     
    			default: printf("\nThe itemsize is not specified\n"); break;// 10 fichier
    		}
    		pch=strrchr(inFile,'.');
    		LZWEncodeFile(inFile, outFile);
        }
     
        else
        {
    		inFile = "C:\\glomosim\\glomosim\\application\\out";
    /*Pourtant inFile est toujours initialisé a "C:\\glomosim\\glomosim\\application\\out"*/
    		strcat(inFile, cpt);strcat(inFile, pch);
    		cptint = atoi(cpt);
    		cptint=cptint+1;
    		itoa (cptint,cpt,10);
     
     
    		printf("\ninFile DECODE apres= %s\n", inFile);
    		LZWDecodeFile(outFile, inFile);
        }
     
        free(inFile); free(outFile);
        inFile = NULL;
        outFile = NULL;
    }
    Quand je fais l'affichage inFile garde toujours la dernière valeur?? pourquoi??

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

Discussions similaires

  1. Découper string en fonction de position avec strncpy
    Par ceinpap dans le forum Débuter
    Réponses: 4
    Dernier message: 20/06/2012, 17h30
  2. utilisation fonction strncpy
    Par john123 dans le forum C
    Réponses: 7
    Dernier message: 16/10/2007, 21h30
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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