getche c getchar

getche



int c=getchar()? (5)

ok, así que estoy leyendo este libro: El lenguaje de programación en C: de Kernighan y Ritchie (segunda edición) y uno de los ejemplos que me cuesta entender cómo funcionan las cosas

#include <stdio.h> #define MAXLINE 1000 int getline(char line[], int maxline); void copy(char to[], char from[]); int main(int argc, char *argv[]) { int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max = 0; while((len = getline(line, MAXLINE)) > 1) { if(len > max) { max = len; copy(longest, line); } } if(max > 0) printf("%s", longest); getchar(); getchar(); return 0; } int getline(char s[], int lim) { int c, i; for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != ''/n''; ++i) s[i] = c; if(c == ''/n'') { s[i] = c; ++i; } s[i] = ''/0''; return i; } void copy(char to[], char from[]) { int i; i = 0; while((to[i] = from[i]) != ''/0'') ++i; }

la línea: for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != ''/n''; ++i) donde dice c = getchar (), ¿cómo puede un integer = entrada de caracteres desde la línea de comando? Enteros sí, pero ¿cómo se almacenan los caracteres que escribo?

Gracias por adelantado


A diferencia de otros idiomas que puede haber usado, los caracteres en C son enteros. char es solo otro tipo de entero, generalmente de 8 bits y más pequeño que int , pero sigue siendo un tipo de entero.

Por lo tanto, no necesita las funciones ord() y chr() que existen en otros idiomas que haya usado. En C puede convertir entre char y otros tipos de enteros usando una conversión, o simplemente asignando.

A menos que se produzca EOF, getchar() se define para devolver "un carácter sin signo convertido a int" ( igual que fgetc ), por lo que si te ayuda puedes imaginar que lee algunos caracteres char, c , luego devuelve (int)(unsigned char)c .

Puede convertir esto de nuevo a un personaje unsigned char solo mediante un lanzamiento o una asignación, y si está dispuesto a perder una pequeña pérdida de portabilidad teórica, puede convertirlo en un personaje con un lanzamiento o asignarlo a un char .


Cada carácter (incluidos los números) ingresado en la línea de comando se lee como un carácter y cada carácter tiene un valor entero basado en su código ASCII http://www.asciitable.com/ .


El tipo C char es de 8 bits, lo que significa que puede almacenar el rango de enteros de -128 a 127 (255 valores distintos; este es el rango de ASCII). getchar() devuelve int , que será de al menos 16 bits (normalmente 32 bits en máquinas modernas). Esto significa que puede almacenar el rango de char , así como más valores.

La razón por la que el tipo de retorno es int es porque el valor especial EOF se devuelve cuando se alcanza el final de la secuencia de entrada. Si el tipo de retorno fuera char , entonces no habría manera de indicar que se encontró el final de la secuencia (a menos que llevara un puntero a una variable donde se registró esta condición).


La respuesta a tu pregunta es contestada. Pero solo agrega 1 cosa más.

Como está declarando la variable c como int. Es bastante claro que está tomando valores de 0 to 9 tienen un valor 48-57 de 48-57 . Así que solo puedes agregar 1 línea más al código

c = c-48 .


getchar() devuelve un entero que es la representación del carácter ingresado. Si ingresa el carácter A , obtendrá ''A'' o 0x41 devuelto (actualizado a un int y asumiendo que está en un sistema ASCII, por supuesto).

La razón por la que devuelve un int lugar de un char es porque necesita poder almacenar cualquier carácter más el indicador EOF donde se cierra el flujo de entrada.

Y, para lo que vale, no es realmente un buen libro para empezar, para los principiantes. Es desde los días en que la eficiencia importaba más que la legibilidad y la capacidad de mantenimiento.

Si bien muestra lo inteligentes que eran los K&R, probablemente deberías estar viendo algo más ... amigable para los principiantes.

En cualquier caso, la última edición cubrió C89 y bastante ha cambiado desde entonces. Hemos revisado C99 y ahora tenemos C11 y el libro no se ha actualizado para reflejar a ninguno de ellos, por lo que está terriblemente fuera de fecha.