Probléme de saisi de caractére !!

Probléme de saisi de caractére !! - C - Programmation

Marsh Posté le 16-08-2005 à 11:42:17    

Bonjour , alors je suis un débutant dans le domaine de la programation , ainsi je me suis procuré un ouvrage sur le langage C.
Et sur l'un des 1er programmes je n'ai pas le résultat souhaité , alors que dans mon bouquin il m'explique que cela marche trés bien  :pt1cable: .
 
Voici le programme:
 
#include <stdio.h>
main()
{      char x;
       x=getc(stdin);
       printf("Le caractere saisi est: %c\n", x);
      return(0);
}
 
 
D'aprés mon livre donc , ce programme devrait me permettre d'afficher a l'écran le caractére que je tape au clavier , or lorsque j'exécute ce programme je peu tapé autant de lettre que je désire jamais la phrase "Le caractere saisi est:" ne s'affiche.
 
Alors j'aimerai savoir quel paramétre m'échappe svp ?
Merci d'avance

Reply

Marsh Posté le 16-08-2005 à 11:42:17   

Reply

Marsh Posté le 16-08-2005 à 12:24:53    

J'ai oublié de préciser que mon compilateur C était "devcpp-4.9.9.2"

Reply

Marsh Posté le 16-08-2005 à 12:28:51    

Attention à l'orthographe.
 
Pourquoi un "return" alors que la spécification de tu ne précises rien dans le prototype de ton "main" ?  
 
Sinon:

Code :
  1. [alt3@endor code]$ gcc ./test.c
  2. [alt3@endor code]$ ./a.out
  3. 4
  4. Le caractere saisi est: 4
  5. [alt3@endor code]$ ./a.out
  6. t
  7. Le caractere saisi est: t

Reply

Marsh Posté le 16-08-2005 à 12:32:05    

Change de bouquin. [:petrus75]

Reply

Marsh Posté le 16-08-2005 à 12:34:20    

_darkalt3_ a écrit :

Attention à l'orthographe.
 
Pourquoi un "return" alors que la spécification de tu ne précises rien dans le prototype de ton "main" ?  


 
Parce qu'en vieux C, le type "int" était implicite, donc il faut quand même un return 0; à la fin du main...
 
Hum et à croire GCC c'est toujours d'actualité, mais c'est de toutes façons pas l'usage. :o


Message édité par Profil supprimé le 16-08-2005 à 12:36:36
Reply

Marsh Posté le 16-08-2005 à 12:41:41    


 
j'aime pas les types implicites :o


Message édité par _darkalt3_ le 16-08-2005 à 12:48:02

---------------
Töp of the plöp
Reply

Marsh Posté le 16-08-2005 à 13:19:56    

par défaut, le type de main est int, et par défaut, il retourne 0 (donc, en l'absence de return, le comportement est défini et standard [:petrus75])

Reply

Marsh Posté le 16-08-2005 à 13:22:41    

euh ta bien tape sur entree apres ton caractere? :pt1cable:

Reply

Marsh Posté le 16-08-2005 à 13:23:15    

theshockwave a écrit :

par défaut, le type de main est int, et par défaut, il retourne 0 (donc, en l'absence de return, le comportement est défini et standard [:petrus75])


 
Au temps pour moi. :o
 
Mais si c'est valide en C ANSI (enfin la norme du K&R quoi...), est-ce que ça l'est encore en C89/90 et C99 ?

Reply

Marsh Posté le 16-08-2005 à 13:39:39    

_darkalt3_ a écrit :

Pourquoi un "return" alors que la spécification de tu ne précises rien dans le prototype de ton "main" ?  


Parce qu'en C90, 'rien' pour le type retourné signifie implicitement 'int'. (En C99, c'est une erreur). Pas de retour, c'est 'void' (et avec main(), ça n'existe pas en C standard).


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-08-2005 à 13:39:39   

Reply

Marsh Posté le 16-08-2005 à 13:42:40    

Ce que dis theShOcKwAvE est incorrect, en C89 on peut ne pas indiquer le type de retour int de la fonction main mais on doit indiquer le return, et en C99 le type de retour doit être indiqué mais le return 0; est implicite si rien n'est spécifié.

Reply

Marsh Posté le 16-08-2005 à 13:51:58    

hostile4 a écrit :

je me suis procuré un ouvrage sur le langage C.


Quel livre ?

Citation :

Et sur l'un des 1er programmes je n'ai pas le résultat souhaité , alors que dans mon bouquin il m'explique que cela marche trés bien
 
Voici le programme:
 

#include <stdio.h>
main()
{      char x;
       x=getc(stdin);
       printf("Le caractere saisi est: %c\n", x);
      return(0);
}




Ca commence mal. Si ton livre te dit réellement de définir x de type char, c'est poubelle directe. Le type retourné par getc() est int. Et c'est important, car en cas d'erreur de lecture, getc() retourne un int < 0 (EOF), ce qu'un char sera incapable d'identifier.
 

Citation :


D'aprés mon livre donc , ce programme devrait me permettre d'afficher a l'écran le caractére que je tape au clavier , or lorsque j'exécute ce programme je peu tapé autant de lettre que je désire jamais la phrase "Le caractere saisi est:" ne s'affiche.


Ce comportement est normal. avec cette fonction, tu peux taper (et éditer) autant de caractères que tu veux (dans les limites du système), le programme restera suspendu jusqu'à ce que tu appuyes sur la touche <enter>. Ensuite, le caractère lu sera le plus ancien caractère tapé. Pour lire les autres, on rappelle la fonction. Quand on lit un '\n', on a terminé de lire la ligne saisie. La prochaine lecture devient blocante.
 
Si ton livre de C n'explique pas ça, c'est poubelle directement.
 
Nota :  

  • utiliser les balises 'fixed' ou 'cpp'...
  • il est recommandé d'expliciter le type retourné et de mettre 'void' si on a pas de paramètres.
  • return est une instruction et non une fonction. Les parenthèses sont inutiles.
  • soigner la présentation (indentation).

#include <stdio.h>
int main (void)
{      
   int x = getc (stdin);
   printf ("Le caractere saisi est: '%c'\n", x);
   return 0;
}


Message édité par Emmanuel Delahaye le 16-08-2005 à 14:11:41

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-08-2005 à 14:50:10    

Merci Emmanuel pour tes explications , le livre est "le langage C" de tony Zhang ,edition "Le tout en poche".
Sinon ce bouquin ne dis pas de définir x comme étant de type char ... c'est moi qui ai fait le boulet

Reply

Marsh Posté le 16-08-2005 à 16:24:22    

Emmanuel Delahaye a écrit :

Parce qu'en C90, 'rien' pour le type retourné signifie implicitement 'int'. (En C99, c'est une erreur). Pas de retour, c'est 'void' (et avec main(), ça n'existe pas en C standard).


 
 
c'était à l'auteur que je m'adressais ;)
(j'aurais du préciser que ce n'était qu'une remarque)


---------------
Töp of the plöp
Reply

Marsh Posté le 18-08-2005 à 17:49:16    

J'ai de nouveau un petit soucis ...
 
Si je rentre cela:
 
 
#include <stdio.h>
#include<stdlib.h>  
 
int x=1;
int *ptr_int;
ptr_int = malloc(x*sizeof(int));
 
 
et bien mon compilateur me dit ceci:  
invalid conversion from 'void' to 'int'
 
alors qu'a nouveau dans mon bouquin cela ne semble poser aucun soucis...
Quelqu'un aurait une explication ??

Reply

Marsh Posté le 18-08-2005 à 18:00:56    

compile en C, pas en C++ :o

Reply

Marsh Posté le 18-08-2005 à 18:53:10    

euh...tu l'as juste pas marque ta fonction main ou tu a carrement oublie de la faire????[:at war with emo]

Reply

Marsh Posté le 18-08-2005 à 19:16:33    

hostile4 a écrit :

ptr_int = malloc(x*sizeof(int));


 
Moi je mettrais plutot :
 

Code :
  1. ptr_int = (int *)malloc(x*sizeof(int));


 
 :)

Reply

Marsh Posté le 18-08-2005 à 19:33:00    

_p1c0_ a écrit :

Moi je mettrais plutot :

Code :
  1. ptr_int = (int *)malloc(x*sizeof(int));




En C, non. Inutile.

ptr_int = malloc (x * sizeof * ptr_int);


 
http://mapage.noos.fr/emdel/notes.htm#malloc


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 18-08-2005 à 19:37:20    

hostile4 a écrit :

J'ai de nouveau un petit soucis ...
 
Si je rentre cela:


#include <stdio.h>
#include<stdlib.h>  
 
int x=1;
int *ptr_int;
ptr_int = malloc(x*sizeof(int));
 


et bien mon compilateur me dit ceci:  
invalid conversion from 'void' to 'int'


A mon avis, il dit plutôt  
 
"invalid conversion from 'void *' to 'int *'"
 
ce qui est typique d'un compilateur C++...

Citation :

alors qu'a nouveau dans mon bouquin cela ne semble poser aucun soucis...
Quelqu'un aurait une explication ??

Ton code est incomplet. Chez moi (compilateur C et non C++), ceci compile sans erreur :  


#include <stdlib.h>
 
int main (void)
{
   int x = 1;
   int *ptr_int;
   ptr_int = malloc (x * sizeof (int));
   return 0;
}


 
Mais c'est tordu. Un peu de lecture :  
 
http://mapage.noos.fr/emdel/notes.htm#malloc


Message édité par Emmanuel Delahaye le 18-08-2005 à 19:37:53

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 19-08-2005 à 10:13:26    

Emmanuel Delahaye a écrit :

En C, non. Inutile.

ptr_int = malloc (x * sizeof * ptr_int);


 
http://mapage.noos.fr/emdel/notes.htm#malloc


 
Merci pour le lien, je le saurais pour la suite!!  :)  

Reply

Marsh Posté le 19-08-2005 à 10:52:36    

Effectivement je complilais en C++ ...  :pfff:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed