lunes, 1 de junio de 2009

Entrada con formato

scanf es la funciòn bàsica de entrada con formato.

int scanf (control, argl, arg2, ...)

char *control;

Esta funciòn lee caracteres con formato a partir del fichero de entrada estàndar "stdin", interpretàndolos de acuerdo a las especificaciones de la cadena de control.

Cada uno de sus argumentos debe ser un puntero, especificando la dirección de la variable donde deberá almacenarse el resultado. Obviamente, scanf es una función que necesita "llamada por referencia", pues va a modificar las variables que se le pasan como argumentos. Un error frecuente en su uso consiste en la omisión de los "&" en cada uno de los argumentos.

Los caracteres de separación como espacios en blanco, fabuladores y caracteres de salto de línea que figuren en la cadena de control, serán ignorados.

Los restantes caracteres (excepto el"%") se corresponden con una especificación de formato de entrada, pudiendo consistir en:

• el carácter asterisco "*", indicando que el valor leído no debe almacenarse en la variable;

• una cadena de dìgitos, especificando la longitud màxima del campo de entrada (el número de caracteres a convertir);

• carácter "h , para indicar que el siguiente argumento debe ser considerado como un puntero a un short int, o el carácter "i' indicando que debe ser tratado como un puntero a un long int, o a un double (equivalente a long float);

• carácter de conversión.

Las conversiones de caracteres de entrada permitidas son:

d - Lee un entero decimal. El argumento debe ser un puntero a un entero (o un puntero a un short int o long int, si se hubiesen antepuesto "h" o "1" a la especificación de formato "d").

o - Lee un número entero octal.

x - Lee un número entero hexadecimal.

c - Lee un único carácter de* la entrada. El argumento debe ser un puntero a un carácter.

s - Acepta una cadena de caracteres terminada por un espacio en blanco o un carácter de salto de línea. El array de caracteres donde se guarde el resultado debejser lo bastante grande como para contener todos los caracteres y el carácter nulo terminador de cadena.

e - Lee un número en coma flotante. El argumento debeser un float (o un double, con especificación "le").

f - Análogo al anterior. Acepta un número en coma flotante.

[ - Lee una cadena de caracteres limitada por separadores arbitrarios, almacenándola en el array apuntado por el argumento. El corchete de apertura "[" va seguido por un conjunto de caracteres y un corchete de cierre "]". Si el carácter inmediatamente posterior a "[" no es un circunflejo "ó", entonces scanf leerá solamente los caracteres que aparezcan en el conjunto de caracteres entre corchetes. Por el contrario, si el carácter inmediatemente posterior a"[" es un circunflejoentonces scanf leerá caracteres hasta que encuentre algún carácter de los contenidos en el conjunto de caracteres entre corchetes.

Los caracteres de conversión d, o, x, e, y f pueden aparecer en mayúsculas o precedidos por una ele "i", para indicar que el correspondiente puntero apunta a un long int o long float.

scanf interrumpe la lectura cuando llega al final.de la cadena de control, o cuando la entrada no cumple la especificación, de formato impuesta (por ejemplo, intentar leer un literal con una especificación %d de número entero).

scanf devuelve un número entero indicando el número de asignaciones que ha realizado o EOF si ha encontrado un final de fichero y esperaba leer más caracteres.

Es importante aclarar que el valor cero no quiere decir que se haya alcanzado el final de fichero, sino que no se ha convertido correctamente ningún campo de entrada.

Análogamente a lo descrito para printf, scanf también permite que su entrada provenga de una cadena de caracteres o de un fichero.

int fscanf(fd, control, argl, arg2,...)

FILE *fd;

char *control;

es similar a scanf, con la diferencia de que toma su entrada del fichero fd, en lugar de "stdin".

int sscanf(control, argl, arg2,...)

char *control;

tomaría su entrada de una cadena de caracteres. Como la lectura de una cadena no viene acompañada de efectos laterales (side effects), sscanf es generalmente más útil que scanf o fscanf.

No hay comentarios:

Publicar un comentario