it-swarm.com.de

So konvertieren Sie ein einzelnes Zeichen in ein int

Ich habe eine Ziffernfolge, z. "123456789", und ich muss jeden von ihnen 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 mir atoi () angesehen, aber es braucht eine Zeichenkette als Argument. Daher muss ich jedes Zeichen in einen String umwandeln und dann atoi darauf aufrufen. Gibt es einen besseren Weg?

53
jonsb

Sie können die Tatsache ausnutzen, dass die Zeichencodierungen für Ziffern alle in der Reihenfolge 48 (für '0') bis 57 (für '9') liegen. Dies gilt für ASCII, UTF-x und praktisch alle anderen Kodierungen ( siehe Kommentare 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'

ist auch zu

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

Allerdings finde ich den ersten c - '0' weitaus lesbarer.

134
Binary Worrier
#define toDigit(c) (c-'0')
20
Antonius RC

Oder Sie können die "richtige" Methode verwenden, ähnlich wie bei der ursprünglichen Methode atoi, jedoch stattdessen mit std :: stringstream. Das sollte mit Zeichen als Eingabe sowie mit Strings funktionieren. (boost :: lexical_cast ist eine weitere Option für eine bequemere Syntax)

(atoi ist eine alte C-Funktion und wird im Allgemeinen empfohlen, die flexibleren und typensicheren C++ - Entsprechungen zu verwenden, sofern möglich. std :: stringstream behandelt die Konvertierung in und aus Strings.

8
jalf

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);
}
4
arun.rajput

Die Antworten sind großartig, solange Sie nur mit arabischen Ziffern arbeiten möchten und in einer Kodierung arbeiten, bei der diese Ziffern sequentiell sind, und zwar an derselben Stelle wie ASCII.

Dies ist fast immer der Fall.

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

Beginnen wir mit ICU .

  1. Konvertieren Sie zuerst den Byte-String in einen Unicode-String. (Links als Übung für den Leser).
  2. Verwenden Sie dann uchar.h , um die einzelnen Zeichen anzuzeigen.
  3. wenn wir der Charakter UBool u_isdigit (UChar32 c) ist
  4. dann ist der Wert int32_t u_charDigitValue ( UChar32 c )

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

3
Douglas Leeder
#include<iostream>
#include<stdlib>
using namespace std;

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

Probleme mit der folgenden Vorgehensweise?

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;
    }
}
1
jonsb

Wenn Sie sind um die Kodierung besorgt sind, können Sie immer eine switch-Anweisung verwenden.

Seien Sie vorsichtig mit dem Format, in dem Sie diese großen Zahlen aufbewahren. Die maximale Größe für eine Ganzzahl beträgt in einigen Systemen nur 65.535 (32.767 Zeichen). Bei anderen Systemen haben Sie 2.147.483.647 (oder 4.294.967.295 ohne Vorzeichen).

1
user54650

Auf diese Weise können Sie char problemlos in int und int in char konvertieren:

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

Für mich funktionierte das ganz gut:

QChar c = '5';
int x = c.digitValue();
// x is now 5

Dokumentation: int QChar :: digitValue () const das sagt:

Gibt den numerischen Wert der Ziffer oder -1 zurück, wenn das Zeichen nicht .__ ist. eine Ziffer.

0
KYL3R