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 :

Ajouter un caractère à une chaine


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Ajouter un caractère à une chaine
    Bonjour,

    j'ai créé une fonction qui ajoute un caractère àa une chaine de caractères
    avec c est un caractère lu d'un fichier f: c=fgetc(f).
    Le problème c'est que la fonction fgetc retourne un int tandis que j'ai besoin d'un char .. comment je fais ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void ajou_c(char* s,char c)
    {
        size_t t=strlen(s);
        realloc(s,(t+1)*sizeof(char));
        s[t]=c;
        s[t+1]='\0';
    }
    Merci

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    Je ne suis pas fan de cette expression... mais j'ai grandement envie de la dire là.... Read The Fabulous Manual !

    man fgetc

    Je cite :
    fgetc() lit le caractère suivant depuis le flux stream et renvoie ce caractère, lu sous forme unsigned char, puis transformé en int, ou EOF en cas d'erreur ou de fin de fichier.
    Bref, il te suffit juste de caster en (unsigned char), voire directement en (char), le résultat de fgetc pour obtenir le caractère

    EDIT : Exemple d'utilisation
    Un peu de google pour trouver ça ! ("man fgetc", et "fgetc exemple")

  3. #3
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    Dans ce genre de cas, on peut regarder la documentation de la fonction. Dans notre cas, j'ai pris la norme pour avoir une définition la plus générale possible, mais, si tu développes sur un système en particulier, les spécifications fournies par celui-ci seront également valables.

    Citation Envoyé par C11 (n1570), § 7.21.7.1 The fgetc function
    Description
    If the end-of-file indicator for the input stream pointed to by stream is not set and a next character is present, the fgetc function obtains that character as an unsigned char converted to an int and advances the associated file position indicator for the stream (if defined).

    Returns
    If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end- of-file indicator for the stream is set and the fgetc function returns EOF. Otherwise, the fgetc function returns the next character from the input stream pointed to by stream. If a read error occurs, the error indicator for the stream is set and the fgetc function returns EOF.)
    En décortiquant un peu, et en sachant que EOF est définie comme une constante de type int ayant une valeur négative, on voit qu'il y a deux cas de figure :

    • Si on a une erreur de lecture ou une fin de fichier, fgetc retourne EOF.
    • Sinon, fgetc retourne le prochain caractère du fichier.


    Donc, si fgetc a une valeur de retour de type int, c'est pour différencier EOF d'un caractère normal. En effet, si elle retournait un char, il y aurait un problème. Considérons les deux cas de figure, suivant si char est signé ou non signé :

    • Si char est non signé, EOF aura la valeur 0xff en unsigned char. Or, EOF et 0xff seront considérés comme différents du fait de la promotion entière.
    • Sinon, il y aura un caractère qui pourra être interprété comme EOF (avec les jeux de caractère latins conventionnels, ce sera généralement « ÿ »).


    De ce fait, fgetc retourne un int, et non pas un char. À partir du moment où tu as clairement identifié que la valeur de retour n'est pas EOF, tu peux correctement l'assigner à un caractère de ton tableau. Du fait de la promotion entière, la conversion est implicite ; l'opérateur de transtypage ne devrait pas être nécessaire ici.

    Par ailleurs, je vois un gros problème avec ton code : tu alloues t+1 bytes, et tu accèdes à la case s[t+1], ce qui est en dehors des bornes de ton tableau. Cela conduit à un comportement indéterminé. En passant, ta méthode de réallocation n'est pas très efficace ; comme realloc a généralement des performances moisies, il est préférable de limiter au maximum de tels appels, par exemple en utilisant une progression géométrique, de manière à éviter les effets de complexité quadratique de l'allocateur, qui devrait recopier la zone mémoire à chaque fois.

    Bonne journée !

Discussions similaires

  1. ajouter des espaces à une chaine de caractères
    Par tricette dans le forum Shell et commandes POSIX
    Réponses: 8
    Dernier message: 28/09/2012, 13h09
  2. Ajouter des caractères à une chaine
    Par bestcasaoui dans le forum Langage
    Réponses: 1
    Dernier message: 28/03/2012, 13h52
  3. Ajouter des caracteres à une chaine
    Par flatron dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/02/2008, 19h15
  4. Enlever des caractères à une chaine
    Par Swiper dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/07/2007, 13h13
  5. [Débutant][JSP] Ajout des caractères à une String...
    Par Henkyl dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 04/03/2004, 16h30

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