Wie man ein einzelnes Zeichen in ein int umwandelt

Ich habe eine Reihe von Ziffern, zB “123456789”, und ich muss jeden einzelnen davon extrahieren, um sie in einer Berechnung zu verwenden. Ich kann natürlich auf jedes Zeichen nach Index zugreifen, aber wie konvertiere ich es in ein int?

Ich habe atoi () untersucht, aber es braucht eine Zeichenfolge als Argument. Daher muss ich jedes Zeichen in eine Zeichenfolge konvertieren und dann atoi darauf aufrufen. Gibt es einen besseren Weg?

Sie können die Tatsache nutzen, dass die Zeichenkodierungen für Ziffern alle in der Reihenfolge von 48 (für ‘0’) bis 57 (für ‘9’) sind. Dies gilt für ASCII, UTF-x und praktisch alle anderen Kodierungen (weitere Informationen hierzu finden Sie weiter unten ).

Daher ist der ganzzahlige Wert für jede Ziffer die Ziffer minus ‘0’ (oder 48).

char c = '1'; int i = c - '0'; // i is now equal to 1, not '1' 

geht auch

 char c = '1'; int i = c - 48; // i is now equal to 1, not '1' 

Allerdings finde ich die erste c - '0' deutlich lesbarer.

 #define toDigit(c) (c-'0') 

Oder Sie können die “correct” -Methode verwenden, ähnlich wie bei Ihrem ursprünglichen atoi-Ansatz, aber stattdessen mit std :: stringstream. Das sollte sowohl mit Zeichen als auch mit Strings funktionieren. (boost :: lexical_cast ist eine weitere Option für eine bequemere Syntax)

(Atoi ist eine alte C-function, und es wird allgemein empfohlen, die flexibleren und typsicheren C ++ – Entsprechungen zu verwenden, wo dies möglich ist. std :: stringstream deckt die Umwandlung in und aus Strings ab)

Sie können die atoi () -function verwenden

 #include  #include  int main(int argc, char* argv[]){ int num ; num = atoi(argv[1]); printf("\n%d", num); } 

Die Antworten sind großartig, solange Sie nur mit arabischen Zahlen umgehen wollen und in einer Kodierung arbeiten, in der diese Zahlen sequentiell sind, und an derselben Stelle wie ASCII.

Dies ist fast immer der Fall.

Wenn dies nicht der Fall ist, benötigen Sie eine geeignete Bibliothek, um Ihnen zu helfen.

Beginnen wir mit der Intensivstation .

  1. Konvertieren Sie zuerst die Byte-Zeichenfolge in eine Unicode-Zeichenfolge. (Links als Übung für den Leser).
  2. Verwenden Sie dann uchar.h , um jedes Zeichen zu betrachten.
  3. Wenn wir das Zeichen UBool u_isdigit (UChar32 c)
  4. dann ist der Wert int32_t u_charDigitValue ( UChar32 c )

Oder vielleicht hat ICU eine function, um es für Sie zu tun – ich habe es nicht im Detail betrachtet.

 #include #include using namespace std; void main() { char ch; int x; cin >> ch; x = char (ar[1]); cout < < x; } 

Wenn Sie sich Sorgen um die Kodierung machen, können Sie immer eine switch-statement verwenden.

Seien Sie vorsichtig mit dem Format, in dem Sie diese großen Zahlen behalten. Die maximale Größe für eine ganze Zahl in einigen Systemen beträgt nur 65.535 (32.767 signiert). Andere Systeme, Sie haben 2.147.483.647 (oder 4.294.967.295 ohne Vorzeichen)

Irgendwelche Probleme mit der folgenden Art, es zu tun?

 int CharToInt(const char c) { switch (c) { case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; default: return 0; } } 

Auf diese Weise können Sie char einfach in int und int in char umwandeln:

 int charToInt(char c) { int arr[]={0,1,2,3,4,5,6,7,8,9}; return arr[c-'0']; }