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 :

Caractères bizarres qui s'affichent à l'exécution


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2021
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Caractères bizarres qui s'affichent à l'exécution
    Bonjour,

    Je ne comprends pas pourquoi quand je lance mon programme, j'ai toujours des caractères bizarres qui s'affichent.

    Voici la partie concernée de mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char table[5];
     
    for (int i = 0; i < 5; i++)
    {
            table[i] = '-';
    }
     
    printf("%s", table);


    Et voici le résultat :

    -----♣

    Savez-vous où se trouve le problème svp ?


    PS: Je tiens à préciser que le résultat est le même si j'utilise une boucle pour afficher ce tableau de caractères.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Citation Envoyé par Unnamed Man Voir le message
    Savez-vous où se trouve le problème svp ?
    C'est trivial : tu ne sais pas ce qu'est 1 chaîne de caractères en C.

    Il manque le caractère sentinelle '\0'.
    Et donc par conséquent, ta chaîne doit contenir 1 caractère de +

    Il y a plusieurs solutions :


    Et effectivement, ta boucle ne sert à rien avec la fonction memset

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2021
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Ah ouii c'est vrai, ce fameux caractère ! Je suis débutant en C, sur les autres langages je n'y étais pas habitué.
    Merci pour ta réponse !

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 691
    Points : 30 988
    Points
    30 988
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par foetus Voir le message
    table[5] = '\0'; à la fin de ta boucle.
    Ou bien avant la boucle, ça marche aussi

    Citation Envoyé par Unnamed Man Voir le message
    Ah ouii c'est vrai, ce fameux caractère ! Je suis débutant en C, sur les autres langages je n'y étais pas habitué.
    Ce que foetus ne dit pas (car pour lui c'est évident) c'est que le concept de "chaine" comme un "tout intégral" n'existe pas en C. En C une chaine c'est simplement une adresse (celle du point où on veut commencer) et ensuite, de caractère en caractère (car on a la garantie qu'ils se suivent en mémoire) on peut récupérer/afficher/traiter toute son contenu.
    Sauf qu'à avancer de caractère en caractère, il faut quelque part un caractère spécial indiquant "terminé" sinon on ne sait pas où s'arrêter, et c'est ce qui se passe chez-toi où ce caractère n'étant pas présent, la fonction printf() continue à afficher le contenu de la RAM. Et enfin (par hasard) elle trouve ce fameux '\0' un peu plus loin ce qui lui permet de s'arrêter (sinon tu aurais à l'écran le dump de ta RAM toute entière).

    Corollaire:
    • toute fonction qui traite une chaine cherchera le '\0'. Tu ne dois jamais lui passer un truc dont tu n'es pas certain qu'il contienne un '\0', chose que tu n'as pas fait
    • toute fonction qui crée/remplit une chaine mettra elle-même le '\0' où il faut (à l'exception de strncpy() et strncat si "n" est atteint mais tu verras ces fonctions plus tard, quand tu sera habitué)
    • chaque fois que tu voudras créer une chaine, tu devras penser "+1" pour garantir la place d'y stocker ce '\0'. Généralement on va même jusqu'à l'écrire pour montrer aux autres lecteurs qu'on y a pensé (ex char table[5 + 1]).
    • tout flux de caractère peut facilement être transformé en chaine, suffit de lui mettre un '\0' quelque part. Mieux, puisqu'une chaine c'est "n'importe quoi mais contenant tout de même un '\0'" alors seul le '\0' suffit pour terminer une chaine. Exemple mettre un '\0' en début de chaine revient à la considérer comme vide (puisque toute fonction qui la traitera s'arrêtera au début)


    Citation Envoyé par Unnamed Man Voir le message
    PS: Je tiens à préciser que le résultat est le même si j'utilise une boucle pour afficher ce tableau de caractères.
    Certainement pas. Si tu utilises la même boucle pour afficher que celle utilisée pour remplir (donc de 0 inclus jusqu'à 5 exclu) alors ton affichage est correct. Ce caractère bizarre provient de ce qu'il y a "après" le 5° tiret.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    (sinon tu aurais à l'écran le dump de ta RAM toute entière).
    Ou un segfault

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/12/2013, 10h23
  2. Réponses: 3
    Dernier message: 06/10/2013, 15h17
  3. Réponses: 9
    Dernier message: 15/01/2010, 16h43
  4. [GD] Génération d'image - Texte bizarre qui s'affiche
    Par fadeninev dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 15/06/2006, 15h25
  5. Réponses: 6
    Dernier message: 06/12/2005, 09h41

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