Pregunta

Tengo una cadena de dígitos, p. " 123456789 " ;, y necesito extraer cada uno de ellos para usarlos en un cálculo. Por supuesto, puedo acceder a cada carácter por índice, pero ¿cómo puedo convertirlo en un int?

He buscado en atoi (), pero toma una cadena como argumento. Por lo tanto, debo convertir cada carácter en una cadena y luego llamar a atoi en él. ¿Hay una mejor manera?

¿Fue útil?

Solución

Puede utilizar el hecho de que las codificaciones de caracteres para los dígitos están todas en orden de 48 (para '0') a 57 (para '9'). Esto es válido para ASCII, UTF-x y prácticamente todas las demás codificaciones ( vea los comentarios a continuación para obtener más información sobre esto ).

Por lo tanto, el valor entero para cualquier dígito es el dígito menos '0' (o 48).

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

es sinónimo de

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

Sin embargo, encuentro que el primer c - '0' es mucho más legible.

Otros consejos

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

O puede usar el " correcto " método, similar a su enfoque original atoi, pero con std :: stringstream en su lugar. Eso debería funcionar con caracteres como entrada y cadenas. (boost :: lexical_cast es otra opción para una sintaxis más conveniente)

(atoi es una función antigua de C, y generalmente se recomienda usar los equivalentes de C ++ más flexibles y seguros de tipo donde sea posible. std :: stringstream cubre la conversión hacia y desde cadenas)

Puede hacer uso de la función atoi ()

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

Las respuestas proporcionadas son excelentes siempre y cuando solo desee manejar números arábigos y trabajen en una codificación donde esos números sean secuenciales y en el mismo lugar que ASCII.

Este es casi siempre el caso.

Si no es así, necesita una biblioteca adecuada para ayudarlo.

Comencemos con ICU .

  1. Primero convierta la cadena de bytes a una cadena unicode. (Izquierda como ejercicio para el lector).
  2. Luego use uchar.h para ver cada personaje.
  3. si el personaje es UBool u_isdigit (UChar32 c)
  4. entonces el valor es int32_t u_charDigitValue (UChar32 c)

O tal vez la UCI tiene alguna función para hacerlo por usted, no lo he visto en detalle.

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

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

Si está preocupado por la codificación, siempre puede usar una instrucción de cambio.

Solo tenga cuidado con el formato en el que mantiene esos números grandes. El tamaño máximo para un número entero en algunos sistemas es tan bajo como 65,535 (32,767 con signo). Otros sistemas, tienes 2,147,483,647 (o 4,294,967,295 sin firmar)

¿Algún problema con la siguiente forma de hacerlo?

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

De esta manera, puede convertir char a int e int a char fácilmente:

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

Para mí, lo siguiente funcionó bastante bien:

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

Documentación: int QChar :: digitValue () const que dice:

  

Devuelve el valor numérico del dígito, o -1 si el carácter no es   un dígito.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top