Cómo convertir un solo carácter en un int

Tengo una cadena de dígitos, por ejemplo, “123456789”, y necesito extraer cada uno de ellos para usarlos en un cálculo. Por supuesto, puedo acceder a cada char por índice, pero ¿cómo lo convierto en un int?

He investigado atoi (), pero se necesita una cadena como argumento. Por lo tanto, debo convertir cada char en una cadena y luego llamar atoi sobre ella. ¿Hay una mejor manera?

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

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, creo que la primera c - '0' mucho más legible.

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

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

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

Puede hacer uso de la función atoi ()

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

Las respuestas proporcionadas son excelentes siempre que solo desee manejar números arábigos, y esté trabajando en una encoding donde esos números sean secuenciales, y en el mismo lugar que ASCII.

Esto es casi siempre el caso.

Si no es así, necesitas una biblioteca adecuada para ayudarte.

Comencemos con ICU .

  1. Primero convierta el byte-string a una cadena Unicode. (A la izquierda como ejercicio para el lector).
  2. Luego usa uchar.h para mirar a 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 ICU tiene alguna función para hacerlo por usted; no lo he analizado en detalle.

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

Si le preocupa la encoding, siempre puede usar una statement de cambio.

Solo tenga cuidado con el formato en el que mantiene esos números grandes. El tamaño máximo para un entero en algunos sistemas es tan bajo como 65.535 (32.767 firmado). 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']; }