Question

Comment C gère-t-il la conversion entre nombres entiers et caractères? Supposons que vous ayez déclaré une variable entière et demandez à l'utilisateur un nombre, mais ils ont plutôt saisi une chaîne. Que se passerait-il?

Était-ce utile?

La solution

L'entrée utilisateur est traitée comme une chaîne qui doit être convertie en un entier utilisant atoi ou une autre fonction de conversion. Atoi retournera 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 en lire un peu plus à la documentation atoi sur MSDN - http://msdn.microsoft.com/en-us/library/yd5xkb5c (VS.80) .aspx

Autres conseils

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

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

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)

Comme d'autres personnes l'ont noté, les données sont normalement entrées sous forme de chaîne. La seule question qui se pose est de savoir quelle fonction est utilisée pour effectuer la lecture. Si vous utilisez une interface graphique, la fonction peut déjà traiter de manière appropriée la conversion en entier et signaler les erreurs. Si vous travaillez avec Standard C, il est généralement plus facile de lire la valeur dans une chaîne (éventuellement avec fgets () , puis de le convertir. Bien que atoi () puisse être utilisé, c’est rarement le meilleur choix; le problème consiste à déterminer si la conversion a réussi (et à produire zéro car l’utilisateur a entré une représentation légitime de zéro) ou non.

De manière générale, utilisez strtol () ou l'un de ses parents ( strtoul () , strtoll () , strtoull () ); pour convertir des nombres en virgule flottante, utilisez strtod () ou une fonction similaire. Les avantages des routines de conversion d’entier incluent:

  • sélection de base facultative (par exemple, base 10, ou base 10 - hex, ou base 8 - octal, ou n’importe laquelle des réponses ci-dessus, en utilisant les conventions standard C (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 me dirige pour bon nombre de ces spécifications de fonction (lorsque je ne regarde pas ma copie de la norme C actuelle) est le POSIX site Web (qui inclut les fonctions C99). Il est centré sur Unix plutôt que sur Windows.

Le programme se bloquerait, vous devez appeler la fonction atoi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top