Antworten:
Wie in anderen Antworten angegeben, ist dies in Ordnung:
char c = '5';
int x = c - '0';
Zur Fehlerprüfung möchten Sie möglicherweise zuerst überprüfen, ob isdigit (c) wahr ist. Beachten Sie, dass Sie dies 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, übernimmt jedoch keine Garantie für andere Zeichen wie Buchstaben des Alphabets.
Subtrahiere '0' wie folgt:
int i = c - '0';
Der C-Standard garantiert, dass jede Ziffer im Bereich '0'..'9'um eine Ziffer größer ist als die vorherige Ziffer (im Abschnitt 5.2.1/3des C99-Entwurfs ). Gleiches gilt für C ++.
Wenn Sie durch einen verrückten Zufall eine Zeichenfolge in eine Ganzzahl konvertieren möchten , können Sie dies auch tun!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
valist jetzt 1024. Anscheinend atoi()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 und strtol()stattdessen eine allgemeinere Funktion verwendet, um 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 wird *strin a konvertiert longund so behandelt, als wäre es eine Basiszahl base. Wenn **endptres nicht null ist, enthält es das erste gefundene nichtstellige Zeichen strtol()(aber wen interessiert das?).
itoa_s().
Subtrahieren Sie char '0' oder int 48 wie folgt:
char c = '5';
int i = c - '0';
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
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
Das heißt, wenn Sie 48 von einem Ziffernzeichen abziehen , wird die Ganzzahl automatisch konvertiert.
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
numeralChar - '0'ist bereits vom Typ int, 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:
char c = '8';
int i = c - '0';
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.
int i = 56 - 48;
i = 8;
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:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** Vergessen Sie nicht, den Status zu überprüfen (der 1 sein sollte, wenn es im obigen Fall funktioniert hat).
Paul.
Wenn ich so etwas tun muss, backe ich ein Array mit den gewünschten Werten vor.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
Dann ist die Konvertierung einfach
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
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.
Verwenden Sie einfach die atol()Funktion:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
Wenn Ihre Ziffer beispielsweise '5'in ASCII ist, wird sie als Binärzahl 0011 0101(53) dargestellt. Jede Ziffer hat die höchsten vier Bits 0011und die niedrigsten 4 Bits repräsentieren die Ziffer in bcd. Also machst du es einfach
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
um die niedrigsten 4 Bits oder, was auch immer, die Ziffer zu erhalten. In asm wird andanstelle von sub(wie in den anderen Antworten) die Operation verwendet .
'5'ist 53 ( 00110101)
Hier sind Hilfsfunktionen, mit denen Sie Ziffern in char in int und umgekehrt konvertieren können:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}
Verwenden Sie die Funktion: atoi für Array zu Integer, atof für Array zu Float-Typ; oder
char c = '5';
int b = c - 48;
printf("%d", b);