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
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
Le programme tomberait en panne, vous devez appeler la fonction atoi.
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.).
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)
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.
- 1. Compatibilité du navigateur entre IE6 et IE7
- 2. Compatibilité C# 4 et CLR
- 3. Modèle C++ pour les entiers entiers sûrs
- 4. Cubes OLAP: Compatibilité entre Analysis Services 2005 et 2008
- 5. Quelle est la compatibilité entre rspec et heckle?
- 6. Compatibilité entre les navigateurs dans ASPNET
- 7. C# expressions régulières - mots entiers correspondants?
- 8. Incompatibilité des types entiers C#
- 9. Interop entre C++ et C#
- 10. Enregistrer un nombre dans une chaîne de caractères entiers et le rappeler dans une action ultérieure
- 11. Interaction entre Java et C#
- 12. Valeur synchronisée entre C# et C++?
- 13. Différences entre Java et C# et .NET
- 14. Obtention et impression de caractères dans C?
- 15. C# XmlDocument.LoadXml et les caractères génériques
- 16. Méthodes refacturées et compatibilité binaire en Java
- 17. API en développement: l'équilibre entre les nouvelles fonctionnalités et compatibilité arrière
- 18. sed recherche de mots entiers et remplacement
- 19. Compatibilité des couleurs SSRS et Excel
- 20. Compatibilité des versions PIA et .NET Framework
- 21. C++ builder 6 et la compatibilité C++ Builder 2009 de codegear
- 22. Databind Entiers
- 23. Objective-C: différence entre id et void *
- 24. Différence C++ entre 0 et 0,0
- 25. Relation entre MSVC++ rand() et C# System.Random
- 26. différences entre StringBuilder en Java et C#
- 27. Communication entre applications AIR (Flex) et C++
- 28. WCF entre Matlab et une application C#
- 29. Différences C# différant entre VS2008 et IIS6
- 30. Création d'un tube entre C# et Ffmpeg