Gibt es eine Möglichkeit, ein Zeichen in C in eine Ganzzahl umzuwandeln?
Zum Beispiel von '5'
bis 5?
Fließen
Gibt es eine Möglichkeit, ein Zeichen in C in eine Ganzzahl umzuwandeln?
Zum Beispiel von '5'
bis 5?
Laut anderen Antworten ist dies in Ordnung:
char c="5";
int x = c - '0';
Außerdem sollten Sie zur Fehlerprüfung zuerst überprüfen, ob isdigit(c) wahr ist. Beachten Sie, dass Sie dasselbe für Briefe nicht vollständig portabel tun können, zum Beispiel:
char c="b";
int x = c - 'a'; // x is now not necessarily 1
Der Standard garantiert, dass die Zeichenwerte für die Ziffern ‘0’ bis ‘9’ zusammenhängend sind, gibt jedoch keine Garantien für andere Zeichen wie Buchstaben des Alphabets.
@Paul Tomblin: Ja für Ziffern, nicht für Buchstaben, da, wie ich in der Antwort sagte, die Standardgarantien ‘0’ bis ‘9’ zusammenhängend sind, aber keine solchen Garantien für andere Zeichen wie ‘a’ bis ‘z’ geben.
– Chris Jung
18. Mai 2009 um 4:46 Uhr
Zeichen c = ‘b’; int x = c – ‘a’; dann ist x nur in ASCII 1?
– dsfdf
10. Januar 2013 um 2:20 Uhr
@Pan In jeder Codierung, einschließlich ASCII, die ‘b’ 1 mehr als ‘a’ hat. Dies gilt immer noch in EBCDIC, macht jedoch (‘j’ – ‘i’) == 8.
– Chris Jung
26. August 2013 um 9:32 Uhr
@ChrisYoung Warum? Ursache in EBCDIC, ‘j’ ist nicht 1 mehr als ‘i’?
– dsfdf
26. August 2013 um 15:10 Uhr
Was vermisse ich hier, wo atoi nicht verwendet wird?
– Daniel
21. Juni 2018 um 19:20 Uhr
Subtrahiere ‘0’ wie folgt:
int i = c - '0';
Der C-Standard garantiert jede Ziffer im Bereich '0'..'9'
ist um eins größer als die vorherige Ziffer (in Abschnitt 5.2.1/3
des C99-Entwurf). Dasselbe gilt für C++.
Diese Antwort wäre besser, wenn Sie erwähnen würden, dass ein Zeichen /bereits/ effektiv eine Ganzzahl ist, obwohl das von der Implementierung definierte Zeichen (dh vorzeichenbehaftet oder nicht vorzeichenbehaftet sein kann) und CHAR_BITS lang ist.
– Arafangion
10. März 2009 um 3:03 Uhr
Ich war mir nicht sicher, ob ich wusste, dass ihm das wirklich hilft. aber Chris machte einen guten Punkt damit, dass a..z nicht unbedingt zusammenhängend sein muss. Das hätte ich stattdessen erwähnen sollen. Jetzt hat er das Rennen gewonnen 🙂
– Johannes Schaub – litb
10. März 2009 um 3:09 Uhr
Ihre ist jedoch besser, weil Sie Ihre Antwort qualifiziert haben – Chris hätte sich sehr gut seine Sachen ausdenken können. 🙂
– Arafangion
10. März 2009 um 3:25 Uhr
Danke für die Wertschätzung. Ich gebe zu, ich war mir über den Status von C nicht sicher, also habe ich nachgesehen und weil ich schon dabei war, habe ich die Referenz in die Antwort eingefügt 🙂
– Johannes Schaub – litb
10. März 2009 um 3:28 Uhr
Und deshalb, Sir, haben Sie ein paar Punkte mehr als ich. 🙂
– Arafangion
10. März 2009 um 3:51 Uhr
Chris Lutz
Wenn Sie durch einen verrückten Zufall a konvertieren möchten Schnur von Zeichen in eine Ganzzahl, das geht auch!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
val
ist jetzt 1024. Anscheinend atoi()
ist in Ordnung, und was ich zuvor darüber gesagt habe, gilt nur für mich (unter OS X (vielleicht (Lisp-Witz hier einfügen))). Ich habe gehört, dass es sich um ein Makro handelt, das ungefähr dem nächsten Beispiel zugeordnet ist, das verwendet strtol()
eine allgemeinere Funktion, um stattdessen die Konvertierung durchzuführen:
char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long
strtol()
funktioniert so:
long strtol(const char *str, char **endptr, int base);
Es konvertiert *str
zu einem long
behandeln es, als ob es eine Basis wäre base
Nummer. Wenn **endptr
nicht null ist, enthält es das erste Zeichen, das keine Ziffer ist strtol()
gefunden (aber wen interessiert das).
Es gibt keine Thread-Probleme mit atoi (es hat keine statischen Daten) und es ist nicht veraltet. Tatsächlich ist es funktional äquivalent zu: #define atoi(x) (int)(strtol((x), NULL, 10)
– Evan Teran
10. März 2009 um 14:43 Uhr
Das Problem mit atoi ist, dass es 0 als Wert „kann hier keine Zahl finden“ verwendet, also geben atoi(„0“) und atoi(„one“) beide 0 zurück. Wenn Sie es verwenden, suchen Sie nach strtol() oder sscanf().
– David Thornley
11. März 2009 um 20:39 Uhr
Der andere Vorteil von strtol ist natürlich, dass Sie möglicherweise andere Dinge aus derselben Zeichenfolge lesen müssen, die nach der Zahl kommen.
– dfeuer
21. Juli 2012 um 21:30 Uhr
@EvanTeran Wenn Sie Visual Studio ausführen, erhalten Sie leider eine Abschreibungswarnung (und werden nicht kompiliert, ohne deaktiviert zu werden). VS empfiehlt jetzt itoa_s()
.
– Xantium
14. Juni 2019 um 10:03 Uhr
Asch
Um die Zeichenziffer in die entsprechende Ganzzahl umzuwandeln. Gehen Sie wie unten gezeigt vor:
char c="8";
int i = c - '0';
Die Logik hinter der obigen Berechnung besteht darin, mit ASCII-Werten zu spielen. ASCII-Wert von Zeichen 8 ist 56, ASCII-Wert von Zeichen 0 ist 48. ASCII-Wert von Integer 8 ist 8.
Wenn wir zwei Zeichen subtrahieren, erfolgt die Subtraktion zwischen ASCII-Zeichen.
int i = 56 - 48;
i = 8;
Arif
Subtrahieren Sie char ‘0’ oder int 48 wie folgt:
char c="5";
int i = c - '0';
Erläuterung: Intern funktioniert es mit ASCII Wert. Aus der ASCII-Tabelle, Dezimalwert des Zeichens 5 ist 53 und 0 ist 48. So 53 – 48 = 5
ODER
char c="5";
int i = c - 48; // Because decimal value of char '0' is 48
Das heißt, wenn Sie abziehen 48 aus jedem numerischen Zeichen wird es automatisch ganze Zahlen konvertieren.
Erleichterung
char numeralChar="4";
int numeral = (int) (numeralChar - '0');
Maxim Machun
Hier sind Hilfsfunktionen, die es ermöglichen, digit in char in int und umgekehrt umzuwandeln:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}