Konvertieren Sie eine Zeichenziffer in die entsprechende Ganzzahl in C

Lesezeit: 5 Minuten

Benutzeravatar von Flow
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

Benutzeravatar von Chris Lutz
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 longbehandeln 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


Ashishs Benutzeravatar
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;

Benutzeravatar von Arif
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.

Benutzeravatar von easeout
Erleichterung

char numeralChar="4";
int numeral = (int) (numeralChar - '0');

Benutzeravatar von Maxim Makhun
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';
}

1423440cookie-checkKonvertieren Sie eine Zeichenziffer in die entsprechende Ganzzahl in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy