Frage

Gibt es eine Möglichkeit, einen Charakter zu einer ganzen Zahl in C zu konvertieren?

Zum Beispiel von '5' bis 5?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top