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 :

Quetion Un peu Debutante sur scanf et printf !


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 1
    Par défaut Quetion Un peu Debutante sur scanf et printf !
    voici un code trés élémentaire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include<stdio.h>
    #include<stdlib.h>
     
    int main (){
     
    char nom[3];
    printf("donnez une chaine \n");
    scanf("%s",nom);
    printf("%s",nom);
     
     
    }
    la question est :

    En donnant une chaine plus grande que 3, mettons "chaine" , le scanf et le printf la lise sans afficher erreur ni la couper à la troisième position !
    pour le scanf je concois le fait qu'il peut lire une saisis plus grande que 3 mais en ecrasant les espaces non reservés qui viennent apres l'espace réservé à notre chaine de 3 , c'est dailleur un des gros desavantage du scanf ..
    Mais comment le printf a su lui continuer l'affichage jusqu'a la fin de la chaine ??

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lavandyne Voir le message
    Mais comment le printf a su lui continuer l'affichage jusqu'a la fin de la chaine ??
    Bonjour
    Pour deux raisons
    D'une part parce que le C ne se préoccupe pas de la taille réservée au tableau. C'est toi qui la connait et qui doit donc faire attention à ce que tu y mets. C'est fait d'ailleurs exprès pour aller le plus vite possible dans une philosophie générale qui est "le programmeur sait ce qu'il fait".
    Donc bien que tu aies défini char nom[3], rien ne t'interdit d'aller taper dans nom[-1] ou nom[5000]. Tu le fais à tes risques.

    D'autre part, parce qu'en C, le type "chaine" n'existe pas. Trop complexe à gérer pour respecter la philosophie ci-dessus. Donc les concepteurs ont défini la convention qu'une chaine serait un tableau de char dans lequel on positionnera une valeur spéciale '\0' symbolisant la fin de la chaine. Et toute fonction devant créer/remplir une chaine (strcpy, strcat, scanf) devra impérativement placer ce '\0' en fin (charge au programmeur d'avoir défini une taille suffisante pour stocker à la fois les caractères de la chaine et aussi ce '\0'). Et toute fonction devant lire/traiter une chaine (strlen, strchr, printf) ne se préoccupera que de rechercher ce '\0' pour savoir quand s'arrêter.

    Donc en écrivant char nom[3], tu dois te forcer ensuite à faire en sorte que ton nom ne soit jamais plus long que 2 caractères (puisque tu dois veiller à conserver une place pour le '\0'). Et printf(), lui, sachant qu'il y a ce '\0' en fin de tableau, boucle jusqu'à ce qu'il le trouve. Mais si tu en saisis plus que 2, scanf() va remplir sans se poser de questions. Et printf() lui, va boucler lui-aussi sans se poser de questions

    Généralement, les programmeurs écrivent plutôt char nom[2 + 1] pour bien montrer qu'ils ont pensé à réserver cette place. Voire même, plus plus de modularité, écrivent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define SIZE_NOM             (2)
    char nom[SIZE_NOM  + 1]
    Ensuite, et si le programmeur utilise "SIZE_NOM" chaque fois qu'il a besoin, dans son code, de faire référence à la taille utile, alors le jour où il veut passer le nom à 20 il modifie juste le "#define" et recompile et tout le code se réadapte automatiquement.
    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]

Discussions similaires

  1. Interrogation sur scanf
    Par gauguin dans le forum C
    Réponses: 13
    Dernier message: 11/02/2007, 01h03
  2. [debutant] pb avec scanf et printf
    Par Andrey dans le forum C
    Réponses: 12
    Dernier message: 17/11/2005, 17h15
  3. Réponses: 5
    Dernier message: 13/06/2005, 17h59

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