2016-09-06 13 views
1

Jusqu'à présent, j'ai découvert que, nous utilisons getchar() comme int car à EOF cette fonction renvoie -1. Je me demandais ne peut pas char tenir -1? Je pense qu'il peut, car il peut également aller de -128 à 127.Pourquoi la fonction getchar() dans C un nombre entier?

J'ai cherché dans la première liste de google, mais la réponse que j'ai reçue ne m'a pas satisfait.

+2

Alors que se passe-t-il quand quelqu'un tape le caractère dont le code est '-1' –

+0

imprime juste -1, je l'ai essayé aussi .. Je pense que quand getChar() renvoie -1, c'est différent, il suffit de taper -1 clavier! @ M.M –

+2

J'ai dit le caractère dont le code est '-1', pas les caractères' -' et '1' –

Répondre

6

tout d'abord, pour clarifier quelque chose, EOF n'a pas à être spécifiquement -1. La norme ISO C exige qu'elle ait une valeur négative.

Notez également que le type char peut être signé ou non signé; cela est défini par l'implémentation.

La fonction fgetc, getc et getchar peut être utilisée pour traiter des flux binaires, pas seulement des flux de texte. Les octets ont des valeurs comprises entre 0 et UCHAR_MAX. Le type naturel pour cette gamme est unsigned char. La valeur de retour de getc ne peut pas être unsigned char, car EOF ne peut pas être représenté. Il ne peut pas être signed char non plus, car signed char ne peut pas contenir les valeurs comprises entre 0 et UCHAR_MAX. Ainsi, un type plus large est choisi: le type int. Sur les plates-formes grand public, int est plus large que char: il a une taille d'au moins 2. Et donc il est capable de représenter une valeur négative qui peut être utilisée pour EOF, et toutes les valeurs d'octets dans la gamme 0 à UCHAR_MAX.

Dans certaines implémentations C (pour des systèmes tels que certaines puces DSP), cela n'est pas vrai: int est un octet de large. Cela représente des défis. Sur une telle implémentation C, une plage de valeurs d'octets valides renvoyées par getc doit simplement être négative, et l'une de ces valeurs se heurte à EOF. Le code écrit avec soin peut indiquer que c'est le cas: une valeur égale à EOF a été retournée, mais les fonctions feof et ferror rapportent faux: le flux n'est pas dans l'erreur, et la fin du fichier ne s'est pas produite. Ainsi, la valeur qui ressemble à EOF est en réalité un octet valide.

+1

merci pour la clarification sur EOF <0, pas forcément EOF = -1. –

4

getchar() et la famille renvoient un entier de sorte que l'EOF -1 se distingue de (char)-1 ou (unsigned char)255.

+0

Je suis un peu confus en ce moment, j'ai essayé de chercher (char) de -1 mais je ne peux pas le trouver? Je vois juste des chiffres positifs sur la [email protected] J Earls –

+0

Si par "table" vous voulez dire le tableau US ASCII ou quelque chose, oui, ceux-ci seront tous des nombres positifs. Cependant, le type C 'char' est un type entier ** signé ** de 8 bits. Il représente les nombres de 0 à 127 et de -128 à -1 plutôt que de 0 à 127 et de 128 à 255. –

0

Les caractères, utilisant le codage Ascii, sont stockés à l'aide d'un octet, qui est un entier non signé de 8 bits. Ainsi, les caractères peuvent prendre la valeur numérique 0-255.

getchar retourne un entier signé pour permettre -1, ce qui est le nombre magique pour la fin de fichier (EOF)