Konvertieren einer Zeichenzahl auf die entsprechende ganze Zahl in C
-
07-07-2019 - |
Frage
Gibt es eine Möglichkeit, einen Charakter zu einer ganzen Zahl in C zu konvertieren?
Zum Beispiel von '5'
bis 5?
Lösung
Wie schon aus anderen Antworten, das ist in Ordnung:
char c = '5';
int x = c - '0';
Auch für die Fehlerprüfung, können Sie möchten isdigit überprüfen (c) gilt zuerst. Beachten Sie, dass Sie nicht vollständig portabel das Gleiche tun für Buchstaben, zum Beispiel:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
Der Standard garantiert, dass die char-Werte für die Ziffern ‚0‘ bis ‚9‘ angrenzen, aber übernimmt keine Garantie für andere Zeichen wie Buchstaben des Alphabets.
Andere Tipps
subtrahieren '0' wie folgt aus:
int i = c - '0';
Der C-Standard garantiert jede Ziffer im Bereich '0'..'9'
ist um eins größer als die vorherige Stelle (in Abschnitt 5.2.1/3
der C99 Entwurf ). Das gleiche gilt für C ++.
Wenn irgendeinen verrückten Zufall, Sie wollen eine Zeichenfolge konvertieren von Zeichen auf eine ganze Zahl, können Sie das auch tun!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
val
ist jetzt 1024. Offenbar atoi()
in Ordnung ist, und was sagte ich es früher gilt nur für mich (auf OS X (vielleicht (einfügen Lisp Witz hier))). Ich habe gehört, es ist ein Makro, das in etwa das folgende Beispiel Karten, die strtol()
verwendet, eine Allzweck-Funktion, um die Konvertierung zu tun statt:
char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long
strtol()
funktioniert wie folgt:
long strtol(const char *str, char **endptr, int base);
Es wandelt *str
zu einem long
, Behandlung, als ob es eine Basis base
Zahl war. Wenn **endptr
nicht null ist, hält er die erste nicht-stellige Zeichen strtol()
gefunden (aber wen interessiert das schon).
subtrahieren char '0' oder 48 wie folgt int:
char c = '5';
int i = c - '0';
Erläuterung: Intern funktioniert es mit ASCII Wert. Aus der ASCII-Tabelle, Dezimalwert Zeichen 5 53 und 0 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 von jeder Ziffer Zeichen, wird es integer automatisch konvertieren.
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
So konvertieren Zeichenzahl zu integer entspricht. Sie, wie unten dargestellt:
char c = '8';
int i = c - '0';
Logik hinter oberhalb der Berechnung ist mit ASCII-Werten zu spielen. ASCII-Wert von 8 Zeichen 56, ASCII-Wert von Zeichen 0 ist 48. ASCII Wert der ganzen Zahl 8 ist 8.
Wenn wir zwei Zeichen subtrahieren, Subtraktion zwischen ASCII Zeichen passieren wird.
int i = 56 - 48;
i = 8;
Wenn es nur ein einzelne Zeichen 0-9 in ASCII, dann die den Wert der ASCII-Null Zeichen aus ASCII-Wert Subtrahieren sollte funktionieren.
Wenn Sie größere Zahlen umwandeln wollen, dann Folgendes tun:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** vergessen Sie nicht, den Status zu überprüfen (die 1 sein sollte, wenn es im obigen Fall gearbeitet hat).
Paul.
char chVal = '5';
char chIndex;
if ((chVal >= '0') && (chVal <= '9')) {
chIndex = chVal - '0';
}
else
if ((chVal >= 'a') && (chVal <= 'z')) {
chIndex = chVal - 'a';
}
else
if ((chVal >= 'A') && (chVal <= 'Z')) {
chIndex = chVal - 'A';
}
else {
chIndex = -1; // Error value !!!
}
Wenn ich so etwas wie dies zu tun, muß prebake ich ein Array mit den Werten ich will.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
Dann wird die Umwandlung ist einfach
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
Dies ist im Grunde der Ansatz von vielen Implementierungen der ctype Bibliothek entnommen. Sie können triviale Weise anpassen dies auch mit hexadezimalen Ziffern zu arbeiten.
Aktivieren Sie diese Option,
char s='A';
int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);
für nur 0,1,2, ...., E, F.
Verwenden Sie einfach die atol()
function:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
Wenn Sie Ihre Stelle ist, sagen wir, '5'
, in ASCII wird sie als binäre Zahl 0011 0101
dargestellt (53). Jede Ziffer hat den höchsten vier Bits 0011
und die niedrigsten 4 Bits repräsentieren die Ziffer in bcd. So dass Sie nur tun
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
die niedrigsten 4 Bits zu erhalten, oder, was seine gleiche, die Ziffer. In asm, verwendet es and
Betrieb statt sub
(wie in den anderen Antworten).
Verwendung Funktion: atoi für Array auf ganzzahlige, atof für Array-Typen zu schweben; oder
char c = '5';
int b = c - 48;
printf("%d", b);
Sie würden es in ein int gegossen (oder schwimmen oder Doppel- oder was auch immer sonst wollen Sie damit zu tun) und speichern sie in anoter variabel.