Gibt es eine Möglichkeit, ein Zeichen in C in eine Ganzzahl umzuwandeln?
Zum Beispiel von '5'
bis 5?
c
type-conversion
Fließen
quelle
quelle
Subtrahiere '0' wie folgt:
Der C-Standard garantiert, dass jede Ziffer im Bereich
'0'..'9'
um eine Ziffer größer ist als die vorherige Ziffer (im Abschnitt5.2.1/3
des C99-Entwurfs ). Gleiches gilt für C ++.quelle
Wenn Sie durch einen verrückten Zufall eine Zeichenfolge in eine Ganzzahl konvertieren möchten , können Sie dies auch tun!
val
ist jetzt 1024. Anscheinendatoi()
ist es 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 undstrtol()
stattdessen eine allgemeinere Funktion verwendet, um die Konvertierung durchzuführen:strtol()
funktioniert so:Es wird
*str
in a konvertiertlong
und so behandelt, als wäre es eine Basiszahlbase
. Wenn**endptr
es nicht null ist, enthält es das erste gefundene nichtstellige Zeichenstrtol()
(aber wen interessiert das?).quelle
itoa_s()
.Subtrahieren Sie char '0' oder int 48 wie folgt:
Erläuterung: Intern funktioniert es mit dem ASCII- Wert. In der ASCII-Tabelle ist der Dezimalwert von Zeichen 5 53 und 0 48 . Also 53 - 48 = 5
ODER
Das heißt, wenn Sie 48 von einem Ziffernzeichen abziehen , wird die Ganzzahl automatisch konvertiert.
quelle
quelle
numeralChar - '0'
ist bereits vom Typint
, sodass Sie die Besetzung nicht benötigen. Auch wenn dies nicht der Fall ist, wird die Besetzung nicht benötigt.Um die Ziffer in eine entsprechende Ganzzahl umzuwandeln. Gehen Sie wie folgt vor:
Die Logik hinter der obigen Berechnung besteht darin, mit ASCII-Werten zu spielen. Der ASCII-Wert von Zeichen 8 ist 56, der ASCII-Wert von Zeichen 0 ist 48. Der ASCII-Wert von Ganzzahl 8 ist 8.
Wenn wir zwei Zeichen subtrahieren, erfolgt eine Subtraktion zwischen ASCII-Zeichen.
quelle
Wenn es sich bei ASCII nur um ein einzelnes Zeichen 0-9 handelt, sollte das Subtrahieren des Werts des ASCII-Nullzeichens vom ASCII-Wert einwandfrei funktionieren.
Wenn Sie größere Zahlen konvertieren möchten, reicht Folgendes aus:
** Vergessen Sie nicht, den Status zu überprüfen (der 1 sein sollte, wenn es im obigen Fall funktioniert hat).
Paul.
quelle
quelle
Wenn ich so etwas tun muss, backe ich ein Array mit den gewünschten Werten vor.
Dann ist die Konvertierung einfach
Dies ist im Grunde der Ansatz, den viele Implementierungen der ctype-Bibliothek verfolgen. Sie können dies trivial anpassen, um auch mit Hex-Ziffern zu arbeiten.
quelle
Überprüfen Sie dies,
für nur 0,1,2, ...., E, F.
quelle
Verwenden Sie einfach die
atol()
Funktion:quelle
Wenn Ihre Ziffer beispielsweise
'5'
in ASCII ist, wird sie als Binärzahl0011 0101
(53) dargestellt. Jede Ziffer hat die höchsten vier Bits0011
und die niedrigsten 4 Bits repräsentieren die Ziffer in bcd. Also machst du es einfachum die niedrigsten 4 Bits oder, was auch immer, die Ziffer zu erhalten. In asm wird
and
anstelle vonsub
(wie in den anderen Antworten) die Operation verwendet .quelle
'5'
ist 53 (00110101
)Hier sind Hilfsfunktionen, mit denen Sie Ziffern in char in int und umgekehrt konvertieren können:
quelle
Verwenden Sie die Funktion: atoi für Array zu Integer, atof für Array zu Float-Typ; oder
quelle
Sie würden es in ein int umwandeln (oder float oder double oder was auch immer Sie sonst damit machen wollen) und es in einer anderen Variablen speichern.
quelle