Biblioteca C de entrada y salida estándar "stdio.h"

En esta biblioteca están las funciones de entrada y salida, tanto de la pantalla y teclado como de ficheros. "stdio" puede y suele leerse como estándar Input/Output. De hecho la pantalla y el teclado son considerados como ficheros, aunque de un tipo algo peculiar. La pantalla es un fichero sólo de escritura llamado stdout, o salida estándar y el teclado sólo de lectura llamado stdin, o entrada estándar.

Se trata de una biblioteca ANSI C, por lo que está heredada de C, y ha perdido la mayor parte de su utilidad al ser desplazada por "iostream". Pero aún puede ser muy útil, es usada por muchos programadores, y la encontrarás en la mayor parte de los programas C y C++.

Veamos ahora algunas funciones.

Función getchar()

Sintaxis:

int getchar(void); 

Lee un carácter desde stdin.

getchar es una macro que devuelve el siguiente carácter del canal de entrada stdin. Esta macro está definida como getc(stdin)".

Valor de retorno:

Si todo va bien, getchar devuelve el carácter leído, después de convertirlo a un int sin signo. Si lee un Fin-de-fichero o hay un error, devuelve EOF.

Ejemplo:

do {
   a = getchar(); 
} while (a != 'q');

En este ejemplo, el programa permanecerá leyendo el teclado mientras no pulsemos la tecla 'q'.

Función putchar()

Sintaxis:

int putchar(int c);

Envía un carácter a la salida stdout.

putchar(c) es una macro definida como putc(c, stdout).

Valor de retorno:

Si tiene éxito, putchar devuelve el carácter c. Si hay un error, putchar devuelve EOF.

Ejemplo:

while(a = getchar()) putchar(a);

En este ejemplo, el programa permanecerá leyendo el teclado y escribirá cada tecla que pulsemos, mientras no pulsemos '^C', (CONTROL+C). Observa que la condición en el while no es a == getchar(), sino una asignación. Aquí se aplican, como siempre, las normas en el orden de evaluación en expresiones, primero se llama a la función getchar(), el resultado se asigna a la variable "a", y finalmente se comprueba si el valor de "a" es o no distinto de cero. Si "a" es cero, el bucle termina, si no es así continúa.

Función gets()

Sintaxis:

char *gets(char *s);

Lee una cadena desde stdin.

gets lee una cadena de caracteres terminada con un retorno de línea desde la entrada estándar y la almacena en s. El carácter de retorno de línea es reemplazado con el carácter nulo en s.

Observa que la manera en que hacemos referencia a una cadena dentro de la función es char *, el operador * indica que debemos pasar como argumento la dirección de memoria donde estará almacenada la cadena a leer. Veremos la explicación en el capítulo de punteros, baste decir que a nivel del compilador char *cad y char cad[], son equivalentes, o casi.

gets permite la entrada de caracteres que indican huecos, como los espacios y los tabuladores. gets deja de leer después de haber leído un carácter de retorno de línea; todo aquello leído será copiado en s, incluido en carácter de retorno de línea.

Esta función no comprueba la longitud de la cadena leída. Si la cadena de entrada no es lo suficientemente larga, los datos pueden ser sobrescritos o corrompidos. Más adelante veremos que la función fgets proporciona mayor control sobre las cadenas de entrada.

Valor de retorno:

Si tiene éxito, gets devuelve la cadena s, si se encuentra el fin_de_fichero o se produce un error, devuelve tNULL. Ejemplo:

char cad[80]; 
do { 
   gets(cad); 
} while (cad[0] != '\000');

En este ejemplo, el programa permanecerá leyendo cadenas desde el teclado mientras no introduzcamos una cadena vacía. Para comprobar que una cadena está vacía basta con verificar que el primer carácter de la cadena es un carácter nulo.

Función puts()

Sintaxis:

int puts(const char *s);

Envía una cadena a stdout.

puts envía la cadena s terminada con nulo a la salida estándar stdout y le añade el carácter de retorno de línea.

Valor de retorno:

Si tiene éxito, puts devuelve un valor mayor o igual a cero. En caso contrario devolverá el valor EOF.

Ejemplo:

char cad[80]; 
int i; 
do { 
   gets(cad); 
   for(i = 0; cad[i]; i++) 
      if(cad[i] == ' ') cad[i] = '_'; 
   puts(cad); 
} while (cad[0] != '\000');

Empezamos a llegar a ejemplos más elaborados. Este ejemplo leerá cadenas en "cad", mientras no introduzcamos una cadena vacía. Cada cadena será recorrida carácter a carácter y los espacios de sustituirán por caracteres '_'. Finalmente se visualizará la cadena resultante.

Llamo tu atención ahora sobre la condición en el bucle for, comparándola con la del bucle do while. Efectivamente son equivalentes, al menos para i == 0, la condición del bucle do while podría haberse escrito simplemente como while (cad[0]). De hecho, a partir de ahora intentaremos usar expresiones más simples.

Comentarios de los usuarios (6)

Droppe
2012-08-30 04:56:56

No soy nuevo en la programación , pero tengo olvidado el C y ahora necesito repasarlo, pues deberé programar para -controladores de interfaz periféricos- (MCUs), mi experiencia en C, se reduce a Borland Turbo C, de finales de los 80. Muy buena la exposición y los ejemplo. gracias por el aporte, saludos y buena suerte.

Droppe

Milton Parra
2014-04-11 00:11:17

Saludos. Quisiera saber si el lenguaje C tiene alguna funciòn para convetir caracteres a números y viceversa. Me explico:

int a = 185 convertido a char sería "185" y

char b[]={"200"} convertido a entero sería 200.

Steven R. Davidson
2014-04-11 23:42:07

Hola Milton,

Bueno, el lenguaje C no ofrece tales conversiones, pero sí podemos usar funciones estándares. Brevemente, usa:

- sprintf() - declarada en <stdio.h> - para convertir cualquier valor numérico a una cadena de caracteres, con la posibilidad de indicar un formato. Por ejemplo,

int a = 185;
char szNum[10] = "";

sprintf( szNum, "%d", a );

- 'atoi()', 'atol()', 'atof()' - declaradas en <stdlib.h> - para convertir una cadena de caracteres a un entero de tipo 'int', a uno de tipo 'long int', y a uno de tipo 'double', respectivamente.

También puedes usar 'strtol()' o 'strtoul()' para convertir a 'long int' o a 'unsigned long int', respectivamente, pero puedes indicar la base numérica; por ejemplo,

char szNum[] = "11101101";
unsigned long int num;

num = strtoul( szNum, NULL, 2 );  // Interpreta la cadena como un entero en base 2

Existe la función, 'strtod()', para convertir a 'double'; obviamente, sin indicar la base.

Espero que esto te sirva.

Steven

Steven R. Davidson
2014-04-11 23:54:09

Hola Milton,

Se me olvidó agregar la función 'sscanf()', declarada en <stdio.h>, para leer y convertir una cadena de caracteres a un número (entero o de coma flotante).

Hasta pronto,

Steven

Milton Parra
2014-04-12 20:03:51

Gracias Steven. Como siempre claro y preciso.

Existe en algunos programas, la utilidad de NO mostrar ciertos caracteres en pantalla cuando el usuario se desvía del formato que queremos capturar. Me explico:

Si quiero capturar datos numéricos, la pantalla no mostraría valores como 25s, d800.

Creo que para lograr esto se debe conocer a fondo el objeto CIN. Te agradezco cualquier ayuda.

Steven R. Davidson
2014-04-14 07:38:13

Hola Milton,

Creo que te refieres a que el programa no muestre un carácter inválido mientras que el usuario esté escribiendo. Me temo que las bibliotecas estándares no te ayudarán para este comportamiento, porque se basan en que la entrada de datos sea acumulada; es decir, espera a acumular todos los caracteres en su búfer interno antes de pasar el control al resto del programa.

Necesitarás usar alguna biblioteca no estándar para implementar este comportamiento, como puede ser el API de MS-Windows o "ncurses" para la consola de Linux.

Espero que esto te sirva.

Steven