char str[20]; printf("Enter anything\n"); scanf("%s",str); for(int i = 0 ; i<strlen(str) ; i++) { if( isdigit(str[i])) printf("%d",(int)str[i]); }Probé con el código anterior, pero la salida está en valores ASCII de los números en lugar de números reales. Me gusta, entrada: "0" salida: "48".
Cuando intento (int)(str[i]-'0'); en lugar de (int)str[i]); , obtengo la respuesta correcta pero no entiendo por qué es correcta.
Hay dos formas en que puede modificar su código para hacer lo que quiere. El primero sería cambiar el printf para imprimir la representación de caracteres en lugar de la representación entera del valor.
printf("%c", str[i]);Imprimirá "0" dada la entrada de la cadena "0" desde el teclado.
El otro, que mencionaste en tu pregunta es:
printf("%d", (int)(str[i]-'0'));La razón por la que obtiene la respuesta correcta aquí tiene que ver con la forma en que la computadora almacena los valores. Cuando escribe un "0", en realidad no almacena el valor 0. En cambio, almacena la representación ASCII de un carácter que llamamos "0". Ese valor resulta ser el número entero 48. 49 representa el carácter "1" y así sucesivamente.
¿Por qué? Bueno, piense en representar el carácter "M" o quizás "#". ¿Qué debería representar a esos? ASCII es una representación conocida de 256 caracteres (aproximadamente), ya que ese es el número total de valores que podemos almacenar en 1 byte. Entonces, "M" es 77 y "#" es 35.
La razón por la que str[i] - '0' funciona tiene que ver con la forma en que C/C++ maneja los caracteres ('0' es un carácter). El carácter 'M' es exactamente equivalente al valor 77. Entonces estas dos líneas serían equivalentes:
str[i] - '0'es lo mismo que
str[i] - 65Como ingreso un "1" (cadena) que se representa en el binario como 66, resto 65 y obtengo 1, el valor. Cuando le pido a printf que muestre el valor entero (%d) de mi resultado
printf("%d", (int)(str[i] - '0'));imprime "1" porque 66 - 65 es 1. O '1' - '0' es 1.
Solo recuerde que cada vez que mira una cadena o un carácter, no está mirando la representación digital o binaria de un valor, está mirando la representación ASCII de ese valor.
Si se sabe que str[i] es un dígito, (int)(str[i]-'0') o más simplemente str[i] - '0' es el valor de este dígito entre 0 y 9 .
La razón de esto: el estándar C exige que los caracteres para representar '0' , '1' , ..., '9' sean exactamente consecutivos. Por lo tanto '1' - '0' == 1 , y así sucesivamente para todos los dígitos.
Solo porque aún no se ha abordado...
No se olvide de la otra forma de convertir matrices de caracteres en números enteros o flotantes:
char num1[]="1234"; char num2[]="123.5"; int x = atoi(num1); double y = atof(num2); printf("%d\n", x); printf("%f\n", y); Nota: strtof(,,) es otra opción para la conversión de cadenas a flotantes.
y strtol(,,) es otra opción para convertir una cadena en un int largo.