Programmation en C: expressions du FOLKLORE en tant que personnage
Lors de la programmation C pour la console de commande, ce qui se passe quand vous avez une fonction qui essaie d'utiliser SCANF pour demander la saisie de l'utilisateur pour une variable CHAR, et que l'utilisateur tape CTRL+Z (EOF) et frappe entrer?
Par exemple:
char promptChar()
{
char c;
printf("Enter a character: ");
scanf("%c", &c);
return c;
}
Si l'utilisateur tape CTRL+Z et frappe entrer, ce qui va promptChar() renvoie? Parce que si je comprends expressions du FOLKLORE, c'est un int.
OriginalL'auteur Thai-Duong Nguyen | 2009-10-13
Vous devez vous connecter pour publier un commentaire.
Tout d'abord:
SCANF
n'est pas définie par la langue.CHAR
n'est pas définie par la langue.Ok, avec que de la route ...
La
scanf()
fonction retourne un entier. Ce nombre entier est le nombre d'éléments d'entrée assignée ou la valeur de la macroEOF
si une panne survient avant la première conversion.Vous n'avez pas vérifier la valeur de retour de la
scanf()
appel, de sorte que vous n'avez aucune idée de ce qui s'est passé. Tout aurait pu travaillé sur ok, ou le flux d'entrée peut-être fini avant la première conversion, ou (pas de %c) il pourrait y avoir un échec de conversion.Tester la valeur de retour de
scanf()
. En effet, toujours tester la valeur de retour de tous les <stdio.h> fonctions.Lorsque le résultat de l'
scanf()
appel estEOF
, si vous voulez plus d'informations sur la raison de l'entrée de l'échec, vous pouvez utiliserfeof()
et/ouferror()
.Pour répondre à votre question:
what will promptChar() return?
Il sera de retour une période indéterminée, la valeur de type char.
Vous pourriez suivre l'exemple de la fonction de la bibliothèque qui traitent de caractères et retourne un int
promptChar()
. Que serait la valeur du caractère lu en fonte àunsigned char
ou négatif d'un int (EOF
) en cas d'erreur. Lire la description pourfgetc()
, par exemple.pas vraiment, la valeur de
c
est retourné sansc
lui-même ou, à son adresse. Problèmes avec le retour des variables locales se produire lorsque vous renvoient des pointeurs."toujours tester la valeur de retour de tous les <stdio.h> les fonctions"—je ne serais pas d'accord. Allez-vous vérifier la valeur de retour et
errno
chaque fois que vous appelezprintf
? C'est exagéré pour moi. Vous n'allez pas être en mesure de faire beaucoup de chose utile si simple sortie comme ça échoue.OriginalL'auteur pmg
Linux
scanf(3)
man:"La valeur EOF est retournée si la fin de l'entrée est atteint avant le premier succès de la conversion ou de l'une correspondant à la rupture. EOF est également retourné si une erreur de lecture se produit, auquel cas l'indicateur d'erreur pour le flux (voir
ferror(3)
) est fixé, et errno contient le code d'erreur."Noter que ce passage concerne la valeur de retour de
scanf
, pas les paramètres de résultat.OriginalL'auteur Michiel Buddingh
Cela dépend du shell de commande que vous utilisez, mais vous ne devriez pas être la conception de tout programme de s'attendre à lire des caractères de contrôle à partir d'une invite de commandes.
La plupart des interfaces de commande va intercepter certains des caractères de contrôle et les utiliser pour indiquer au shell de faire les choses. Par exemple, ctrl-s ctrl-q souvent de démarrer et d'arrêter la coque de l'écran de caractères de sortie. ctrl-z sur certaines coquilles seront effectivement prises comme une commande pour fermer la coque vers le bas.
EOF se produit lorsqu'un read() sur le fichier renvoie zéro octets de données. Lorsque vous tapez Control-D (ou ctrl-Z) dans le terminal, il envoie tout dans l'attente de caractères pour les programmes de lecture à partir du terminal. Si il n'y a pas dans l'attente de caractères, la lecture() renvoie la valeur 0, ce qui est interprété comme des expressions du FOLKLORE. Et des expressions du FOLKLORE est de -1 sur presque toutes les plates-formes; qui n'est pas 0xFFFFFFFF sur les plates-formes 64 bits.
Jonathan: je le sais. Je pense que vous êtes vigoureusement d'accord avec moi. Ce EOF est pas est un caractère de contrôle". Ce n'est pas une partie du flux. Et j'ai dit "la plupart" des plates-formes, donc je ne comprends pas le nit. Je l'ai écrit en hexadécimal pour faire le fait que ce n'est pas un char clair.
Yup, ASCII définit EOT (Fin de Transmission, 04) ETX (Fin de Texte, 03), même EM (Fin de Support), mais pas les expressions du FOLKLORE. Il y a un FS (Fichier Séparateur).
OriginalL'auteur T.E.D.