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 :

utilisation fonction strncpy


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 181
    Par défaut utilisation fonction strncpy
    Bonjour,
    Dans mon programme je lis un fichier texte qui est composé d'un mot par ligne.
    Cependant lorsque je lis ma ligne il y a toujours ce fameux caractère 'null' qui me donne donc 4 pour une chaine "abc" par exemple.
    Donc j'utilise la fonction strncpy comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char chaine[10];
    char chaineSansNull[10];
     
    strncpy(chaineSansNull,chaine,strlen(chaine)-1)
    Mais cela ne me donne pas des resultats satisfaisants. Aurais je fait une erreur dans son utilisation?

    Au debut du fichier pas de problème mais au fur je retrouve ma chaine de reference ("abc" par exemple) à laquelle sont collés d'autres caracteres

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Tu ne confondrais pas null ('\0') et retour à la ligne ('\n') ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 181
    Par défaut
    je ne pense pas car quand j'utilise strlen sur ma ligne récupérée cela m'indique 4 caractères pour une chaine abc par exemple. Et j'ai donc consulté la faq C ce qui me fait penser qu'il s'agit de null non?
    Sinon comment puis je obtenir la bonne chaine (sans null ou le caractere de retour à la ligne)?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Quelques révisions s'imposent :
    chaînes de caractères => http://c.developpez.com/faq/?page=st...NGS_definition
    strncpy => http://man.developpez.com/man3/strncpy.3.php
    strlen => http://man.developpez.com/man3/strlen.3.php

    Une chaîne de caractère est une suite de caractères consécutifs terminée par un 0.
    La fonction strlen() calcule la longueur de la chaîne de caractères s, sans compter le carèctere nul `\0' final.
    La fonction strncpy() est identique, sauf que seuls les n premiers octets de src sont copiés. Ainsi, s'il n'y a pas de caractère nul dans les n premiers octets de src, la chaîne résultante ne disposera de caractère nul final.
    Qu'en déduis-tu ?
    Il faut un caractère '\0' à la fin de la chaîne (caractère qui n'est pas pris en compte dans la longueur de la chaine).
    Si ta chaîne est de longueur 4, c'est qu'il y a sûrement un retour à la ligne à la fin et ensuite un caractère null et on peut difficilement en douter puique tu lis un fichier.
    La fonction strncpy peut ne pas mettre le caractère null (ce qui est ton cas)

    C'est donc à toi de le mettre à la place qu'occupait avant le caractère de retour à la ligne.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 181
    Par défaut
    c'est précisément l'article que je disais de la faq.
    mais n'existe t il pas un moyen simple d'effectuer cette modification? Avec une fonction preexistante peut etre mais je ne l'ai pas trouvé
    Par exemple en java on a la fonction replace de la classe string

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Tu peux faire ceci par exemple mais on peut imaginer autre chose.
    Attention, ça ne vérifie pas que le dernier caractère est bien un retour à la ligne, que la chaine est au moins de longueur 1.
    A toi de voir tes besoins.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    size_t len = strlen (chaine);
    chaine [len - 1] = '\0';
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char chaine[10];
    char chaineSansNull[10]; /* Attention, le nom de cette variable ne colle pas */
    size_t len = strlen (chaine);
     
    strncpy(chaineSansNull,chaine,len-1)
    chaineSansNull[len-1] = '\0';

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Kio,
    Citation Envoyé par aoyou Voir le message
    Tu peux faire ceci par exemple mais on peut imaginer autre chose.
    Attention, ça ne vérifie pas que le dernier caractère est bien un retour à la ligne, que la chaine est au moins de longueur 1.
    A toi de voir tes besoins.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    size_t len = strlen (chaine);
    chaine [len - 1] = '\0';
    Édité, j'avais écrit des bêtises.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 181
    Par défaut
    cela fonctionne
    merci beaucoup de ton aide

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

Discussions similaires

  1. Pb de blancs dans utilisation fonction FtpFindFirstFile
    Par AlvinTheMaker dans le forum MFC
    Réponses: 2
    Dernier message: 06/04/2005, 12h33
  2. Réponses: 6
    Dernier message: 24/02/2005, 09h44
  3. [GIMP] [Script-FU] Utilisation fonction gimp-curves-spline
    Par narmataru dans le forum Autres langages
    Réponses: 1
    Dernier message: 09/02/2005, 17h25
  4. [Débutant] Aide utilisation fonctions :(
    Par trakiss dans le forum Débuter
    Réponses: 10
    Dernier message: 27/08/2004, 15h59
  5. Utilisation fonction définie dans un .Dll
    Par jeab. dans le forum Windows
    Réponses: 5
    Dernier message: 23/03/2004, 16h23

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