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 :

Probleme sur les chaines de caractere


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 80
    Points : 84
    Points
    84
    Par défaut Probleme sur les chaines de caractere
    quand je fais le scanf je rentre une chaine de caractere et quand je veux l'afficher il m'affiche qsue le premier mot, il s'arrete au premier espace, pourquoi?
    Le programme marche bien en lui meme il dois supprimer les espaces, mais il marche que lorsque je fais *txt="ma chaine"; mais si je fais scanf sa marche plus!! Merci de m'aider a+
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
     
    void decal &#40;char *t&#41;;
     
    void main &#40;&#41;
    &#123;
       char txt&#91;20&#93;;
       scanf &#40;"%s",txt&#41;;
       printf&#40;"\n%s",p&#41;;
       decal&#40;txt&#41;;
       printf&#40;"\n %s",txt&#41;;
       getch &#40;&#41;;
    &#125;
     
    void decal &#40;char *t&#41;
    &#123;
       int i,j;
    	i=0;
       while&#40;i < 20&#41;
       &#123;
       	if&#40;t&#91;i&#93;== 32&#41;
          &#123;
          	j = i;
             while&#40;j < 20&#41;
             &#123;
             	t&#91;j&#93; = t&#91;j+1&#93;;
                j++;
             &#125;
          i--;
          &#125;
          else
          	i++;
       &#125;
    &#125;

  2. #2
    Abu
    Abu est déconnecté
    Candidat au Club
    Inscrit en
    Mai 2002
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    essai gets(*char) a la place de scanf pour voir.

    gets(txt);
    Groumpf !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 80
    Points : 84
    Points
    84
    Par défaut
    je te remercie ca marche impec

  4. #4
    Abu
    Abu est déconnecté
    Candidat au Club
    Inscrit en
    Mai 2002
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    de rien !
    Groumpf !

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2002
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 23
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par Abu
    essai gets(*char) a la place de scanf pour voir.

    gets(txt);
    Avec gets, on ne peut pas préciser la taille maximale de la chaîne à lire (donc possibilité de buffer overflow).

    Préférez toujours l'utilisation de fgets :

    char *fgets(char *s, int n, FILE *stream);

    L'appel fgets(txt, borne, stdin) est équivalent à gets(txt).

  6. #6
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Salut,

    L'astuce est la suivante : Si tu veux prendre une chaîne de caractère avec scanf, quand il y a des espaces, il faut spécifier jusqu'à quel caractère tu veux récupérer. Dans ce cas là on dira le retour à la ligne ... On utilise donc scanf("%[^\n]", txt);

    Voici donc le code qui fonctionne :

    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
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <conio.h> 
    #include <string.h> 
     
    void decal (char *t); 
     
    void main () 
    { 
       char txt[20]; 
       scanf ("%[^\n]",txt);
       printf("\n%s",txt);
       decal(txt); 
       printf("\n %s",txt); 
       getch ();
    }
     
    void decal (char *t) 
    { 
       int i,j; 
       i=0; 
       while(i < 20) 
       { 
          if(t[i]== 32) 
          { 
             j = i; 
             while(j < 20) 
             { 
                t[j] = t[j+1]; 
                j++; 
             } 
          i--; 
          } 
          else 
             i++; 
       } 
    }
    Pour les détails voir les tutoriels et cours de formation pour apprendre le langage C : http://c.developpez.com/cours/
    Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 80
    Points : 84
    Points
    84
    Par défaut
    Je te remercie je connaissais pas cette astuce, c'est pratique

  8. #8
    Membre éclairé Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Points : 656
    Points
    656
    Par défaut
    L'astuce est la suivante : Si tu veux prendre une chaîne de caractère avec scanf, quand il y a des espaces, il faut spécifier jusqu'à quel caractère tu veux récupérer. Dans ce cas là on dira le retour à la ligne ... On utilise donc scanf("%[^\n]", txt);
    Je suis également très interessé par cette astuce mais j'ai vu dans l'exmple l'utilisation de conio.h qui ne fait pas partie de la librairie du C ANSI.
    Ma question est donc la suivante : "Est-ce que cela fonctionne en C ANSI ?"

    Cordialement,
    Rémi ;-)

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 80
    Points : 84
    Points
    84
    Par défaut
    oui car scanf est dans la librairie stdio.h

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

Discussions similaires

  1. besoin d'aide sur les chaine de caractere
    Par nico85 dans le forum C++
    Réponses: 10
    Dernier message: 13/01/2007, 13h03
  2. Réponses: 8
    Dernier message: 04/08/2006, 16h24
  3. Probleme avec les chaines de caracteres
    Par jesuscrie dans le forum C
    Réponses: 5
    Dernier message: 30/06/2006, 23h56
  4. probleme avec les chaines de caracteres
    Par snake77350 dans le forum C
    Réponses: 11
    Dernier message: 25/04/2006, 19h29
  5. probleme sur les chaines de caractere
    Par foufi5 dans le forum C
    Réponses: 8
    Dernier message: 22/12/2005, 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