Como converter um único char em um int

Eu tenho uma seqüência de dígitos, por exemplo, “123456789”, e eu preciso extrair cada um deles para usá-los em um cálculo. É claro que posso acessar cada caractere por índice, mas como posso convertê-lo em um int?

Eu olhei em atoi (), mas leva uma string como argumento. Portanto, devo converter cada caractere em uma string e, em seguida, chamar o atoi. Existe uma maneira melhor?

Você pode utilizar o fato de que as codificações de caracteres para dígitos estão todas em ordem de 48 (para ‘0’) a 57 (para ‘9’). Isso vale para ASCII, UTF-x e praticamente todas as outras codificações ( veja os comentários abaixo para saber mais sobre isso ).

Portanto, o valor inteiro para qualquer dígito é o dígito menos ‘0’ (ou 48).

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

é sinônimo de

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

No entanto, acho o primeiro c - '0' muito mais legível.

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

Ou você poderia usar o método “correto”, semelhante à sua abordagem atoi original, mas com std :: stringstream em seu lugar. Isso deve funcionar com caracteres como input e também como strings. (boost :: lexical_cast é outra opção para uma syntax mais conveniente)

(Atoi é uma function C antiga e geralmente é recomendado usar os equivalentes de C ++ mais flexíveis e seguros quando possível. std :: stringstream cobre conversões de e para strings)

Você pode fazer uso da function atoi ()

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

As respostas fornecidas são ótimas, desde que você queira apenas lidar com algarismos arábicos e esteja trabalhando em uma codificação onde esses numerais são sequenciais e no mesmo lugar que ASCII.

Isso é quase sempre o caso.

Se não for, então você precisa de uma biblioteca adequada para ajudá-lo.

Vamos começar com a UTI .

  1. Primeiro converta a string de bytes em uma string unicode. (Esquerda como um exercício para o leitor).
  2. Em seguida, use uchar.h para ver cada caractere.
  3. se o caractere for UBool u_isdigit (UChar32 c)
  4. então o valor é int32_t u_charDigitValue ( UChar32 c )

Ou talvez a UTI tenha alguma function para fazer isso por você – eu não a analisei em detalhes.

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

Se você está preocupado com a codificação, você sempre pode usar uma instrução switch.

Apenas tome cuidado com o formato em que você mantém esses números grandes. O tamanho máximo para um número inteiro em alguns sistemas é tão baixo quanto 65.535 (32.767 assinados). Outros sistemas, você tem 2.147.483.647 (ou 4.294.967.295 não assinados)

Algum problema com a seguinte maneira de fazer isso?

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

Desta forma Você pode converter char para int e int para char facilmente:

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