So konvertieren Sie ein einzelnes Zeichen in ein Int [duplicate]

Lesezeit: 5 Minuten

So konvertieren Sie ein einzelnes Zeichen in ein Int duplicate
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


So konvertieren Sie ein einzelnes Zeichen in ein Int duplicate
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.

Lass uns beginnen mit Intensivstation.

  1. Konvertieren Sie zuerst den Byte-String in einen Unicode-String. (Links als Übung für den Leser).
  2. Dann benutze uchar.h jeden Charakter anzuschauen.
  3. wenn wir der Charakter ist UBool u_isdigit (UChar32 c)
  4. 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.

1646910013 303 So konvertieren Sie ein einzelnes Zeichen in ein Int duplicate
Gemeinschaft

#include<iostream>
#include<stdlib>
using namespace std;

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

1646910014 438 So konvertieren Sie ein einzelnes Zeichen in ein Int duplicate
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

987650cookie-checkSo konvertieren Sie ein einzelnes Zeichen in ein Int [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy