2008-09-27 7 views
1

Comment C gère-t-il la conversion entre entiers et caractères? Supposons que vous ayez déclaré une variable entière et que vous demandiez un numéro à l'utilisateur, mais qu'il saisisse une chaîne à la place. Ce qui se passerait?C Compatibilité entre entiers et caractères

Répondre

6

L'entrée de l'utilisateur est traitée comme une chaîne qui doit être convertie en int en utilisant atoi ou une autre fonction de conversion. Atoi renverra 0 si la chaîne ne peut pas être interpolée en tant que nombre car elle contient des lettres ou d'autres caractères non numériques.

Vous pouvez lire un peu plus à la documentation atoi sur MSDN - http://msdn.microsoft.com/en-us/library/yd5xkb5c(VS.80).aspx

0

Le programme tomberait en panne, vous devez appeler la fonction atoi.

3

Euh? Vous entrez toujours une chaîne. Puis vous parsez convertir cette chaîne en nombre, de diverses manières (en demandant à nouveau, en prenant une valeur par défaut, etc.) de gérer diverses erreurs (débordement, caractères incorrects, etc.).

3

Une autre chose à noter est que dans C, les caractères et les entiers sont « compatibles » dans une certaine mesure. Tout caractère peut être affecté à un int. L'inverse fonctionne également, mais vous perdrez des informations si la valeur entière ne rentre pas dans un char.

char foo = 'a'; // The ascii value representation for lower-case 'a' is 97 
int bar = foo; // bar now contains the value 97 
bar = 255; // 255 is 0x000000ff in hexadecimal 
foo = bar; // foo now contains -1 (0xff) 
unsigned char foo2 = foo; // foo now contains 255 (0xff) 
3

Comme d'autres l'ont noté, les données sont normalement entrée comme une chaîne - la seule question est que la fonction est utilisée pour faire la lecture. Si vous utilisez une interface graphique, la fonction peut déjà traiter de la conversion en nombre entier et des erreurs de génération de rapports, et donc de manière appropriée. Si vous travaillez avec la norme C, il est généralement plus facile de lire la valeur dans une chaîne (peut-être avec fgets() et de convertir.) Bien que atoi() peut être utilisé, c'est rarement le meilleur choix, le problème est de déterminer si la conversion a réussi (et produit zéro parce que l'utilisateur est entré dans une représentation légitime de zéro) ou non

en général, utiliser strtol() ou un de ses parents (strtoul(), strtoll(), strtoull());. pour convertir un nombre à virgule flottante, utilisez strtod() ou une fonction similaire. L'avantage des routines de conversion entières comprend:

  • sélection de base optionnelle (par exemple, base 10, ou base 10 - hex, ou base 8 - octale, ou l'une des conventions C ci-dessus (007 pour octal, 0x07 pour hex, 7 pour décimal).
  • détection d'erreur facultative (en sachant où la conversion s'est arrêtée).

L'endroit où je vais pour beaucoup de ces spécifications de fonction (quand je ne regarde pas ma copie de la norme réelle C) est le site Web POSIX (qui inclut des fonctions C99). Il est centré sur Unix plutôt que sur Windows.

Questions connexes