Een enkele char converteren naar een int

Ik heb een reeks cijfers, b.v. “123456789”, en ik moet ze allemaal extraheren om ze in een berekening te gebruiken. Ik heb natuurlijk toegang tot elke char per index, maar hoe converteer ik deze naar een int?

Ik heb gekeken naar atoi(), maar het neemt een string als argument. Daarom moet ik elke char in een string omzetten en er vervolgens atoi op aanroepen. Is er een betere manier?


Antwoord 1, autoriteit 100%

U kunt gebruikmaken van het feit dat de tekencoderingen voor cijfers allemaal in volgorde van 48 (voor ‘0’) tot 57 (voor ‘9’) zijn. Dit geldt voor ASCII, UTF-x en praktisch alle andere coderingen (zie opmerkingen hieronder voor meer informatie hierover).

Daarom is de gehele waarde voor elk cijfer het cijfer minus ‘0’ (of 48).

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

is synoniem aan

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

Ik vind de eerste c - '0'echter veel leesbaarder.


Antwoord 2, autoriteit 14%

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

Antwoord 3, autoriteit 5%

Of je zou de “juiste” methode kunnen gebruiken, vergelijkbaar met je originele atoi-aanpak, maar met std::stringstream in plaats daarvan. Dat zou moeten werken met tekens als invoer en tekenreeksen. (boost::lexical_cast is een andere optie voor een handiger syntaxis)

(atoi is een oude C-functie en het wordt over het algemeen aanbevolen om waar mogelijk de meer flexibele en typeveilige C++-equivalenten te gebruiken. std::stringstream dekt de conversie van en naar strings)


Antwoord 4, autoriteit 3%

U kunt gebruik maken van de functie atoi()

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

Antwoord 5, autoriteit 2%

De gegeven antwoorden zijn geweldig zolang je alleen Arabische cijfers wilt verwerken en werkt in een codering waarbij die cijfers opeenvolgend zijn, en op dezelfde plaats als ASCII.

Dit is bijna altijd het geval.

Als dat niet het geval is, heb je een goede bibliotheek nodig om je te helpen.

Laten we beginnen met ICU.

  1. Converteer eerst de byte-string naar een unicode-string. (Links als oefening voor de lezer).
  2. Gebruik vervolgens uchar.hom naar elk teken te kijken.
  3. als we het karakter is UBool u_isdigit (UChar32 c)
  4. dan is de waarde int32_t u_charDigitValue ( UChar32 c )

Of misschien heeft ICU een functie om het voor u te doen – ik heb er niet in detail naar gekeken.


Antwoord 6

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

Antwoord 7

Als u zich zorgenzorgen maakt over codering, kunt u altijd een switch-statement gebruiken.

Wees voorzichtig met het formaat waarin je die grote getallen bewaart. De maximale grootte voor een geheel getal in sommige systemen is slechts 65.535 (32.767 ondertekend). Andere systemen, je hebt 2.147.483.647 (of 4.294.967.295 niet-ondertekende)


Antwoord 8

Problemen met de volgende manier van doen?

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

Antwoord 9

Op deze manier kunt u char gemakkelijk converteren naar int en int naar char:

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

Antwoord 10

Ik ben het eens met @jalf. De sstream-bibliotheek en stoilijkt de aanbevolen aanpak te zijn:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
  stringstream st;
  st << 1  << '2';
  cout << stoi(st.str()) + 1; 
  return 0;
}

Uitvoer

13

Ik ben een nieuwe student van C++ maar een oude LAMP-stackontwikkelaar. Ik hoopte dat de tekenreeksklasse meer dingen had om soepel over te schakelen tussen tekens en tekenreeksen, maar ik heb nog niet zoiets gevonden dat native wordt ondersteund.


Antwoord 11

Voor mij werkte het volgende redelijk goed:

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

Documentatie: int Qchar :: digiTwaarde () const welke zegt:

Retourneert de numerieke waarde van het cijfer, of -1 als het personage dat niet is
een cijfer.

Other episodes