c++ - pasar - Cómo convertir un solo carácter en un int
funcion itoa en c (9)
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 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);
}
¿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''];
}
Las respuestas proporcionadas son excelentes siempre que solo desee manejar números arábigos, y esté trabajando en una codificación 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 .
- Primero convierta el byte-string a una cadena Unicode. (A la izquierda como ejercicio para el lector).
- Luego usa uchar.h para mirar a cada personaje.
- si el personaje es
UBool u_isdigit (UChar32 c)
- 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.
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 sintaxis 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 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.
Si le preocupa la codificación, siempre puede usar una declaración 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)
#define toDigit(c) (c-''0'')
#include<iostream>
#include<stdlib>
using namespace std;
void main()
{
char ch;
int x;
cin >> ch;
x = char (ar[1]);
cout << x;
}