numeros - Conversión de int a char en C
int to string c linux (6)
Conversión de Int a Char
Supongo que OP quiere más que solo una conversión de 1 dígito a medida que se suministra radix
.
Para convertir un int
en una cadena , (no solo 1 char
) existe el enfoque sprintf(buf, "%d", value)
.
Para hacerlo en cualquier raíz, la gestión de cadenas se convierte en un problema, además de tratar el caso de esquina de INT_MIN
La siguiente solución C99 devuelve un char*
cuya duración es válida hasta el final del bloque. Lo hace al proporcionar un compuesto literal a través de la macro.
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
// Maximum buffer size needed
#define ITOA_BASE_N (sizeof(unsigned)*CHAR_BIT + 2)
char *itoa_base(char *s, int x, int base) {
s += ITOA_BASE_N - 1;
*s = ''/0'';
if (base >= 2 && base <= 36) {
int x0 = x;
do {
*(--s) = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[abs(x % base)];
x /= base;
} while (x);
if (x0 < 0) {
*(--s) = ''-'';
}
}
return s;
}
#define TO_BASE(x,b) itoa_base((char [ITOA_BASE_N]){0} , (x), (b))
Uso de muestra y pruebas
void test(int x) {
printf("base10:% 11d base2:%35s base36:%7s ", x, TO_BASE(x, 2), TO_BASE(x, 36));
printf("%ld/n", strtol(TO_BASE(x, 36), NULL, 36));
}
int main(void) {
test(0);
test(-1);
test(42);
test(INT_MAX);
test(-INT_MAX);
test(INT_MIN);
}
Salida
base10: 0 base2: 0 base36: 0 0
base10: -1 base2: -1 base36: -1 -1
base10: 42 base2: 101010 base36: 16 42
base10: 2147483647 base2: 1111111111111111111111111111111 base36: ZIK0ZJ 2147483647
base10:-2147483647 base2: -1111111111111111111111111111111 base36:-ZIK0ZJ -2147483647
base10:-2147483648 base2: -10000000000000000000000000000000 base36:-ZIK0ZK -2147483648
Ref. Cómo usar literales compuestos para fprintf()
números formateados múltiples con bases arbitrarias?
En este momento estoy tratando de convertir un int a un char en la programación C. Después de investigar, descubrí que debería poder hacerlo así:
int value = 10;
char result = (char) value;
Lo que me gustaría es que esto devuelva ''A'' (y para 0-9 para devolver ''0'' - ''9''), pero esto devuelve un nuevo carácter de línea, creo. Toda mi función se ve así:
char int2char (int radix, int value) {
if (value < 0 || value >= radix) {
return ''?'';
}
char result = (char) value;
return result;
}
Echa un vistazo a la tabla ascii
Los valores almacenados en un char se interpretan como los caracteres correspondientes a esa tabla. El valor de 10 es una nueva línea
Los personajes usan una codificación (generalmente ASCII) para asignar números a un personaje en particular. Los códigos para los caracteres ''0''
a ''9''
son consecutivos, de modo que para valores menores a 10, se agrega el valor a la constante de caracteres ''0''
. Para los valores 10 o más, se agrega el valor menos 10 a la constante de caracteres ''A''
:
char result;
if (value >= 10) {
result = ''A'' + value - 10;
} else {
result = ''0'' + value;
}
Por lo tanto, los caracteres en C se basan en ASCII (o UTF-8, que es compatible con códigos ASCII ). Esto significa que bajo el capó, "A" es realmente el número "65" (excepto en binario en lugar de decimal). Todo un "char" en C es un entero con suficientes bytes para representar cada carácter ASCII. Si quiere convertir un int
en un char
, necesitará instruir a la computadora para que interprete los bytes de un int como valores ASCII, y ha pasado un tiempo desde que hice C, pero creo que el compilador se quejará desde char
tiene menos bytes que int
. Esto significa que necesitamos una función, como usted ha escrito. Así,
if(value < 10) return ''0''+value;
return ''A''+value-10;
será lo que quieras devolver de tu función. Mantenga sus límites de verificación con "radix" como lo ha hecho, que es una buena práctica en C.
Una forma portátil de hacer esto sería definir un
const char* foo = "0123456789ABC...";
donde ...
están el resto de los personajes que quieres considerar.
Entonces y foo[value]
evaluará a un char
particular. Por ejemplo, foo[0]
será ''0''
, y foo[10]
será ''A''
.
Si usted asume una codificación particular (como el ASCII común pero de ninguna manera omnipresente), entonces su código no es estrictamente portátil.
para convertir int a char no tienes que hacer nada
char x;
int y;
/* do something */
x = y;
solo un int al valor de char como el dígito imprimible (generalmente ASCII) como en su ejemplo:
const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int inttochar(int val, int base)
{
return digits[val % base];
}
si desea convertir a la cadena (char *), entonces necesita usar cualquiera de las funciones stansdard como sprintf, itoa, ltoa, utoa, ultoa .... o escribir una usted mismo:
char *reverse(char *str);
const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *convert(int number, char *buff, int base)
{
char *result = (buff == NULL || base > strlen(digits) || base < 2) ? NULL : buff;
char sign = 0;
if (number < 0)
{
sign = ''-'';
}
if (result != NULL)
{
do
{
*buff++ = digits[abs(number % (base ))];
number /= base;
} while (number);
if(sign) *buff++ = sign;
if (!*result) *buff++ = ''0'';
*buff = 0;
reverse(result);
}
return result;
}