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ère répété deux fois


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 30
    Par défaut Caractère répété deux fois
    Bonjour

    J'ai un problème assez bizarre, je pense savoir d'où ça vient, mais pas comment y remédier.
    Je débute en C, j'ai crée un programme en PHP que je voudrais convertir en C sans interface, juste en command-line, j'ai donc crée ce script pour la base:
    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
    39
    40
    41
     
    int main()
    {
    printf("Usage:\n");
    printf("c : Create a new file.\n");
    printf("q : Quit.\n");
    char command;
     
     
    while(1)
    {
    printf(">");
    command=getchar();
     
     
    	if(command=='c')
    		{
    		printf("Type file name:\n");
    		char filename[80];
    		scanf("%s",filename);
    		char buf[]="test\n";
    		int fd;
    		fd =  open(filename, O_CREAT | O_RDWR, 0644);
    		write(fd, buf, sizeof buf);
    		}
     
    	if(command=='b')
    		{
    		printf("blablabla\n");
    		}
     
    	if(command=='q')
    		{
    		printf("Quit\n");
    		break;
    		}
     
     
    }
    return 0;
    }
    En gros, l'utilisateur tape un lettre et une commande s'exécute, ça marche, mais il y a un hic: à chaque lettre tapée, le caractère ">" est répété deux fois:

    Je pense savoir d'où ça vient:
    quand je tape disons 2 lettres à la suite j'obtiens ça:
    >>>
    et si j'appuie juste sur entrer ça donne:
    > (ce qu'il faut)
    J'ai l'impression que quand je tape un caractère, le caractère de retour à la ligne est aussi pris en compte, et à cause de la boucle while, tous les caractères sont traités un par un à chaque itération de la boucle, le retour à la ligne compris.

    Seulement voilà, je n'ai pas la moindre idée de comment résoudre ça

    Si quelqu'un pouvait m'aider... merci d'avance

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Tu peux consulter les très nombreux nombreux posts de ce forum disant pourquoi il ne faut pas utiliser scanf() lorsqu'on débute.

    EDIT: bon, le scanf() n'est pas le probleme en fait (enfin, pas encore...). Comme tu l'indiques, il faut ajouter un test pour 'entrée'. C'est le caractere '\n'.
    Egalement, declare command comme un int pour se conformer au retour de getchar().

  3. #3
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Puis tu dois aussi purger stdin, comme suit et ca marchera:
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    static void PurgeFile (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n');
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          /* purge */
          int c;
          while ((c = fgetc(fp)) != '\n' && c != EOF)
          {
          }
       }
    }
     
    int main(int argc, char *argv[])
    {
      char command;
      int fd;
      char filename[80];
      char buf[]="test\n";
     
      printf("Usage:\n");
      printf("c : Create a new file.\n");
      printf("q : Quit.\n");
     
      while(1)
      {
       printf(">");
       command=getchar();
     
       if(command=='c')
       {
        printf("Type file name:\n");
    	scanf("%s",filename);
     
    	fd =  open(filename, O_CREAT | O_RDWR, 0644);
     
        write(fd, buf, sizeof buf);
    	}
     
    	if(command=='b')
    	{
    	 printf("blablabla\n");
    	}
     
    	if(command=='q')
    	{
    	 printf("Quit\n");
    	 break;
    	}
    	PurgeFile(buf, stdin);
      }
      system("PAUSE");
      return EXIT_SUCCESS;
    }
    Tu peux consulter les très nombreux nombreux posts de ce forum disant pourquoi il ne faut pas utiliser scanf() lorsqu'on débute.
    Par contre, il est vrai qu'il te faudra remplacer scanf par fgets.

    Puis les variables, ca serait bien que tu les déclares toutes en début de fonction.

  4. #4
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fd =  open(filename, O_CREAT | O_RDWR, 0644);
    write(fd, buf, sizeof buf);
    Utiliser fopen et fwrite pourrait être mieux.

    Bonne soirée

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Horrigan
    En gros, l'utilisateur tape un lettre et une commande s'exécute, ça marche, mais il y a un hic: à chaque lettre tapée, le caractère ">" est répété deux fois:

    Je pense savoir d'où ça vient:
    quand je tape disons 2 lettres à la suite j'obtiens ça:
    >>>
    et si j'appuie juste sur entrer ça donne:
    > (ce qu'il faut)
    J'ai l'impression que quand je tape un caractère, le caractère de retour à la ligne est aussi pris en compte, et à cause de la boucle while, tous les caractères sont traités un par un à chaque itération de la boucle, le retour à la ligne compris.
    • Ce code est incomplet. Il manque les headers. Le comportement est indéfini.
    • open() n'est pas standard. C'est fopen() etc.
    • apprendre à utiliser switch-case. Ces 'if' sont horribles !
    • en principe, on ne met pas de 0 dans un fichier texte. Utiliser strlen().
    • le fichier n'est jamais fermé.

    Les saisies sont erronées. Voici comment on peut faire proprement :

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    (Ton code mis au point. pose des questions si tu ne comprends pas. )
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #include <stdio.h>
    #include <string.h>
     
    static void get_s(char *s, size_t size)
    {
       fgets(s, size, stdin);
       {
          char *p = strchr(s, '\n');
     
          if (p != NULL)
          {
             *p = 0;
          }
          else
          {
             int c;
             while ((c = getchar()) != '\n' && c != EOF)
             {
             }
          }
       }
    }
     
    static int get_c(void)
    {
       int x = EOF;
       char s[8];
       get_s(s, sizeof s);
       x = *s;
       return x;
    }
     
    int main()
    {
       printf("Usage:\n");
       printf("c : Create a new file.\n");
       printf("q : Quit.\n");
       char command;
       while (1)
       {
          printf(">");
          command = get_c();
          if (command == 'c')
          {
             printf("Type file name:\n");
             char filename[80];
     
             /* edit (C90) */
             {
                char buf[] = "test\n";
                FILE *fp = fopen(filename, "w");
                if (fp != NULL)
                {
                   fwrite(buf, 1, strlen (buf), fp);
                   fclose (fp), fp = NULL;
                }
             }
          }
          if (command == 'b')
          {
             printf("blablabla\n");
          }
          if (command == 'q')
          {
             printf("Quit\n");
             break;
          }
       }
       return 0;
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 30
    Par défaut
    Whaouw, c'est vraiment sympa de carrément corriger tout le code, mais j'en demandais pas tant

    Ce code est incomplet. Il manque les headers. Le comportement est indéfini.
    open() n'est pas standard. C'est fopen() etc.
    apprendre à utiliser switch-case. Ces 'if' sont horribles !
    en principe, on ne met pas de 0 dans un fichier texte. Utiliser strlen().
    le fichier n'est jamais fermé.
    -Le header c'est juste #include <Carbon/Carbon.h>, je sais c'est bizarre, c'est Xcode, je développe sous mac, les stdio.h je connais pas ^^

    -Pour les fichiers j'ai utilisé un script que j'ai trouvé sur internet, j'ai un livre sur le C (de Tony Zhang), mais je suis pas au point là dessus, je vais réparer ça :p

    -Pour le switch, je l'avais utilisé pour mon premier essai, mais je l'ai remplacé par des if et j'ai même essayé les goto pour voir si ça résolvait le problème des >>, j'ai juste oublié de le remettre ^^

    J'ai essayé ton code, il marche très bien je le comprends à peu près (vu de loin), mais jamais j'aurais réussi à faire ça moi même, il faudrait que je reprenne mon livre depuis le début...

    Je comprends bien à quoi servent les fonctions get_s et get_c mais pas exactement comment elles marchent, c'est surtout les pointeurs qui me troublent.
    Sinon pour l'écriture du fichier et le reste j'ai compris ^^

    Vraiment merci beaucoup pour cette aide

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Horrigan
    Je comprends bien à quoi servent les fonctions get_s et get_c mais pas exactement comment elles marchent, c'est surtout les pointeurs qui me troublent.
    Tu ne peux pas faire de C si tu ne maîtrises pas les pointeurs. Fait des petits programmes d'essais, passe du temps là dessus, pose des questions précises.

    Pour commencer :

    http://emmanuel-delahaye.developpez.....htm#pointeurs

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 30
    Par défaut
    Sisi, j'ai bien compris ce qu'étaient les pointeurs et comment on s'en servait, mais ce que j'ai pas compris, c'est leur utilité, mon livre n'en fait pas mention ^^
    Accéder à une variable par un pointeur j'en vois pas l'utilité, j'utilise directement le nom de la variable, c'est plus pratique ^^

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Horrigan
    mais ce que j'ai pas compris, c'est leur utilité, mon livre n'en fait pas mention. Accéder à une variable par un pointeur j'en vois pas l'utilité, j'utilise directement le nom de la variable, c'est plus pratique.
    Certes, mais il y a des cas (paramètres, notamment) où on est obligé de passer l'adresse via un pointeur (tableaux, chaines, structures, données à modifier...).

    Tu verras ça à l'usage.

    De plus le but de la programmtion n'est pas que ce soit "pratique" (à écrire), mais que le comportement et les interfaces soient conformes à la specification et que les performances soient tenues.

    Attends toi à un usage massif des pointeurs en C 'avancé' (et encore, pas trop...)

    - Allocation dynamique
    - Fichiers
    - Structures de données non linéaires (tableaux a plusieurs dimensions, liste, arbres)...
    - pointeurs de fonctions...

    bref, c'est le quotidien du programmeur C...

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 30
    Par défaut
    Arrête de me faire peur ou je vais passer à Java
    J'essaierai de tester de bout de code dès que j'aurais le temps

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/09/2014, 07h25
  2. [SQL] Requete me renvoyant deux fois le meme nom
    Par Pepito dans le forum Langage SQL
    Réponses: 9
    Dernier message: 14/10/2005, 14h35
  3. Lire deux fois un inputstream
    Par Guybrush dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 05/09/2005, 14h50
  4. Réponses: 14
    Dernier message: 30/03/2005, 21h50
  5. Sélectionner un même enregistrement deux fois...
    Par Manu0086 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 02/02/2004, 13h09

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