So konvertieren Sie ein einzelnes Zeichen in ein Int [duplicate]
Lesezeit: 5 Minuten
jonsb
Ich habe eine Reihe von Ziffern, zB “123456789”, und ich muss jede einzelne davon extrahieren, um sie in einer Berechnung zu verwenden. Ich kann natürlich auf jedes Zeichen per Index zugreifen, aber wie konvertiere ich es in ein Int?
Ich habe atoi() untersucht, aber es nimmt einen String als Argument. Daher muss ich jedes Zeichen in einen String umwandeln und dann atoi darauf aufrufen. Gibt es einen besseren Weg?
Warum müssen Sie jede einzeln extrahieren, anstatt eine Reihe von Ziffern als tatsächliche Zahl zu behandeln?
– Calyth
13. Januar 2009 um 22:35 Uhr
Der String ist eigentlich keine Zahl, sondern einzelne Ziffern, genauer gesagt eine Sozialversicherungsnummer. Ich möchte eine Berechnung durchführen, die die ssn validiert.
– jonsb
15. Januar 2009 um 8:10 Uhr
Duplikat von Convert char to int in C und C++ (erste Interpretation)
– Benutzer202729
2. September 2021 um 14:38 Uhr
Binäre Besorgnis
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 (siehe Kommentare unten für mehr dazu).
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'
ist synonym zu
char c="1";
int i = c - 48; // i is now equal to 1, not '1'
Allerdings finde ich das erste c - '0' weit besser lesbar.
Gibt es eine Codierung, bei der ‘9’-‘0’ != 9 ? Ich bin mir nicht einmal sicher, ob eine solche Kodierung per ISO C++ erlaubt wäre.
– MSalter
14. Januar 2009 um 13:46 Uhr
Zu Codierungen und der Reihenfolge der Ziffern habe ich diese Frage gestellt stackoverflow.com/questions/782373/…. Die kurze Antwort lautet „Jede Codierung basierend auf Ascii oder EBCDIC, ja“ (was 99,9 % der Codierungen bedeutet, denen wir im Alltag und im Internet begegnen werden). Interessanterweise scheinen die c/c++-Standards auch zu besagen, dass sie nur Kodierungen unterstützen, bei denen die Ziffern geordnet sind.
– Binäre Sorge
24. Mai 2009 um 9:24 Uhr
Gibt es eine Codierung, bei der es nicht ‘0’ < '1' < '2' < '3' gibt? Es wäre zumindest eine sehr sehr seltsame Entscheidung
– Friedrich
21. Oktober 2009 um 15:36 Uhr
Das garantiert der C++-Standard '0' durch '9' nebeneinander und in der richtigen Reihenfolge im Zeichensatz vorkommen. Also die c - '0' funktioniert auf allen Systemen, während c - 48 würde zum Beispiel nicht auf EBCDIC funktionieren.
– MM
16. Januar 2016 um 22:23 Uhr
Beachten Sie, dass C11 §5.2.1 Zeichensätze ¶3 sagt: Sowohl im Quell- als auch im Ausführungsbasiszeichensatz der Wert jedes Zeichens danach 0 in der obigen Liste von Dezimalziffern muss um eins größer sein als der Wert der vorherigen. Der C++-Standard wird eine ähnliche Regel haben.
– Jonathan Leffler
10. April 2020 um 20:02 Uhr
#define toDigit(c) (c-'0')
Oder Sie könnten die “richtige” Methode verwenden, ähnlich wie bei Ihrem ursprünglichen Atoi-Ansatz, aber stattdessen mit std::stringstream. Das sollte sowohl mit Zeichen als Eingabe als auch mit Zeichenfolgen funktionieren. (boost::lexical_cast ist eine weitere Option für eine bequemere Syntax)
(atoi ist eine alte C-Funktion, und es wird im Allgemeinen empfohlen, nach Möglichkeit die flexibleren und typsicheren C++-Äquivalente zu verwenden. std::stringstream deckt die Konvertierung in und aus Strings ab.)
Schön, mein C ++ ist rostig und ich dachte, es gäbe einen sichereren Weg, hatte aber keine Zeit, nachzusehen.
– Binäre Sorge
13. Januar 2009 um 17:19 Uhr
Sie können die Funktion atoi() verwenden
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]){
int num ;
num = atoi(argv[1]);
printf("\n%d", num);
}
Die bereitgestellten Antworten sind großartig, solange Sie nur arabische Ziffern verarbeiten möchten und in einer Codierung arbeiten, bei der diese Ziffern sequentiell und an derselben Stelle wie ASCII sind.
Dies ist fast immer der Fall.
Wenn dies nicht der Fall ist, benötigen Sie eine geeignete Bibliothek, die Ihnen hilft.
wenn wir der Charakter ist UBool u_isdigit (UChar32 c)
dann ist der Wert int32_t u_charDigitValue ( UChar32 c )
Oder vielleicht hat die ICU eine Funktion, die das für Sie erledigt – ich habe sie mir nicht im Detail angesehen.
Gemeinschaft
#include<iostream>
#include<stdlib>
using namespace std;
void main()
{
char ch;
int x;
cin >> ch;
x = char (ar[1]);
cout << x;
}
Benutzer54650
Wenn du sind Wenn Sie sich Sorgen um die Codierung machen, können Sie immer eine switch-Anweisung verwenden.
Seien Sie nur vorsichtig mit dem Format, in dem Sie diese großen Zahlen aufbewahren. Die maximale Größe für eine ganze Zahl in einigen Systemen beträgt nur 65.535 (32.767 mit Vorzeichen). Andere Systeme haben 2.147.483.647 (oder 4.294.967.295 unsigned)
Wie kann eine einfache switch-Anweisung bei verschiedenen Kodierungen helfen?
– gimp
13. Januar 2009 um 16:26 Uhr
Weil Unicode-Ziffern genau 10 Stellen abdecken und ASCII-Ziffern genau 10 Stellen abdecken. Übersehe ich etwas?
– Benutzer54650
13. Januar 2009 um 16:30 Uhr
Sie müssen sich keine Gedanken über die Codierung machen. auch wenn die Nummern nicht zwischen 48 und 58 liegen – die Nummern müssen alle in ihrer Codierung benachbart sein. Sie können also immer noch ‘0’ von jeder Ziffer subtrahieren und korrekte Ergebnisse erhalten. Ich glaube, ich habe das in der Norm gelesen
– Johannes Schaub – litb
13. Januar 2009 um 21:23 Uhr
9876500cookie-checkSo konvertieren Sie ein einzelnes Zeichen in ein Int [duplicate]yes
Warum müssen Sie jede einzeln extrahieren, anstatt eine Reihe von Ziffern als tatsächliche Zahl zu behandeln?
– Calyth
13. Januar 2009 um 22:35 Uhr
Der String ist eigentlich keine Zahl, sondern einzelne Ziffern, genauer gesagt eine Sozialversicherungsnummer. Ich möchte eine Berechnung durchführen, die die ssn validiert.
– jonsb
15. Januar 2009 um 8:10 Uhr
Duplikat von Convert char to int in C und C++ (erste Interpretation)
– Benutzer202729
2. September 2021 um 14:38 Uhr