Scanf C
Scanf C

Video: Scanf C

Video: Scanf C
Video: Cuidado post parto en bovinos - La Finca de Hoy 2024, Noviembre
Anonim

En este artículo, la función scanf() se considera de forma general sin referencia a un estándar específico, por lo que aquí se incluyen datos de cualquier estándar C99, C11, C++11, C++14. Quizás, en algunos estándares, la función funciona con diferencias del material presentado en el artículo.

función scanf C - descripción

scanf() es una función ubicada en los archivos de encabezado stdio.h(C) y cstdio(C++), también conocida como entrada de programa formateada. scanf lee los caracteres del flujo de entrada estándar (stdin) y los convierte según el formato, luego los escribe en las variables especificadas. Formato: significa que los datos se convierten a una determinada forma al recibirlos. Así, la función scanf C se describe:

scanf("%formato", &variable1[, &variable2, […]), donde las variables se pasan como direcciones. La razón de esta forma de pasar variables a una función es obvia: como resultado del trabajo, devuelve un valor que indica la presencia de errores, por lo quela única forma de cambiar los valores de las variables es pasándolas por dirección. Además, gracias a este método, la función puede procesar datos de cualquier tipo.

Algunos programadores se refieren a funciones como scanf() o printf() como procedimientos debido a la analogía con otros lenguajes.

Scanf permite la entrada de todos los tipos de lenguaje básicos: char, int, float, string, etc. En el caso de variables de tipo cadena, no es necesario especificar el signo de dirección - "&", ya que la variable de tipo cadena es una matriz, y su nombre es la dirección del primer elemento de la matriz en la memoria de la computadora..

Usando C en C++
Usando C en C++

Formato de entrada de datos o cadena de control

Comience mirando el ejemplo de la función scanf C de la descripción.


incluye int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); devolver 0; //requisito para sistemas linux }

El formato de entrada consta de los siguientes cuatro parámetros: %[ancho][modificadores] tipo. En este caso, el signo "%" y el tipo son parámetros obligatorios. Es decir, el formato mínimo se ve así: "%s", "%d" y así sucesivamente.

En general, los caracteres que componen la cadena de formato se dividen en:

  • especificadores de formato: cualquier cosa que comience con %;
  • caracteres de separación o espacio - son espacio, tabulador(t), nueva línea (n);
  • caracteres que no sean espacios en blanco.

La función puede no ser segura.

Utilice scanf_s() en lugar de scanf().

(mensaje de Visual Studio)

Tipo, especificadores de formato, caracteres de conversión o caracteres de control

código binario
código binario

Una declaración scanf C debe contener al menos un especificador de formato, que se especifica al final de las expresiones que comienzan con "%". Le dice al programa el tipo de datos que debe esperar al ingresar, generalmente desde el teclado. Lista de todos los especificadores de formato en la siguiente tabla.

Tipo Significado
1 %c El programa está esperando la entrada de un carácter. La variable a escribir debe ser del tipo de carácter char.
2 %d El programa espera la entrada de un número decimal de tipo entero. La variable debe ser de tipo int.
3 %i El programa espera la entrada de un número decimal de tipo entero. La variable debe ser de tipo int.
4 %e, %E El programa espera ingresar un número de coma flotante (coma) en forma exponencial. La variable debe ser de tipo float.
5 %f El programa espera un número de coma flotante (coma). La variable debe ser de tipo float.
6 %g, %G El programa espera un número de coma flotante (coma). La variable debe ser de tipo float.
7 %a El programa espera un número de coma flotante (coma). La variable debe ser de tipo float.
8 %o El programa espera un número octal. La variable debe ser de tipo int.
9 %s El programa está esperando que se ingrese una cadena. Una cadena es un conjunto de cualquier carácter hasta el primer carácter separador encontrado. La variable debe ser de tipo cadena.
10 %x, %X El programa está esperando un número hexadecimal. La variable debe ser de tipo int.
11 %p Variable espera entrada de puntero. La variable debe ser de tipo puntero.
12 %n

Escribe en una variable un valor entero igual al número de caracteres leídos hasta el momento por la función scanf.

13 %u El programa lee un entero sin signo. El tipo de variable debe ser un entero sin signo.
14 %b El programa está esperando un número binario. La variable debe ser de tipo int.
15 % Conjunto de caracteres escaneados. El programa está esperando a que se introduzcan los caracteres.del grupo limitado especificado entre corchetes. scanf funcionará siempre que haya caracteres del conjunto especificado en el flujo de entrada.
16 %% Firme "%".

Caracteres en la cadena de formato

código C++
código C++

Símbolo de estrella ()

El asterisco () es una bandera que indica que se debe suprimir la operación de asignación. Se coloca un asterisco inmediatamente después del signo "%". Por ejemplo,


scanf("%d%c%d", &x, &y); //ignora el caracter entre dos enteros. scanf("%s%d%s", cadena, cadena2); // ignora el entero entre dos cadenas.

Es decir, si ingresas la línea "45-20" en la consola, el programa hará lo siguiente:

  1. A la variable "x" se le asignará el valor 45.
  2. A la variable "y" se le asignará el valor 20.
  3. Y el signo menos (guion) "-" será ignorado gracias a "%c".

Ancho (o ancho de campo)

Este es un número entero entre el signo "%" y el especificador de formato que especifica el número máximo de caracteres para leer en la operación de lectura actual.


scanf("%20s", cadena); //leer los primeros 20 caracteres del flujo de entrada

Hay algunas cosas importantes a tener en cuenta:

  1. scanf terminará si encuentra un carácter separador, incluso si no cuenta 20 caracteres.
  2. Si se ingresan más de 20 caracteres, solo los primeros 20 caracteres se escribirán en str.

Modificadorestipo (o precisión)

código de bienvenida
código de bienvenida

Estos son indicadores especiales que modifican el tipo de datos esperados para la entrada. La bandera se especifica a la izquierda del especificador de tipo:

  • L o l (L pequeña) Cuando se usa "l" con los especificadores d, i, o, u, x, la bandera le dice al programa que se espera una entrada larga int. Cuando se usa "l" con el especificador e o f, la bandera le dice al programa que debe esperar un valor doble. El uso de "L" le dice al programa que se espera un doble largo. El uso de "l" con los especificadores "c" y "s" le dice al programa que se esperan caracteres de dos bytes como wchar_t. Por ejemplo, "%lc", "%ls", "%l[asd]".
  • h es una bandera que indica el tipo corto.
  • hh: indica que la variable es un puntero a un valor de carácter con signo o carácter sin signo. La bandera se puede utilizar con los especificadores d, i, o, u, x, n.
  • ll (dos pequeñas L): indica que la variable es un puntero a un valor de tipo int largo largo con signo o int largo largo sin signo. La bandera se usa con los especificadores: d, i, o, u, x, n.
  • j: indica que la variable es un puntero al tipo intmax_t o uintmax_t del archivo de encabezado stdint.h. Usado con especificadores: d, i, o, u, x, n.
  • z: indica que la variable es un puntero al tipo size_t, cuya definición se encuentra en stddef.h. Usado con especificadores: d, i, o, u, x, n.
  • t: indica que la variable es un puntero al tipo ptrdiff_t. Definición eneste tipo está en stddef.h. Usado con especificadores: d, i, o, u, x, n.

Más claramente, la imagen con modificadores se puede representar como una tabla. Tal descripción de scanf C para programadores será más clara.

Especificadores y modificadores de tipo
Especificadores y modificadores de tipo

Otros personajes

Se descartarán todos los caracteres que se encuentren en el formato. Al mismo tiempo, debe tenerse en cuenta que la presencia de espacios en blanco o caracteres separadores (nueva línea, espacio, tabulador) en la cadena de control puede provocar un comportamiento diferente de la función. En una versión, scanf() leerá sin guardar ningún número de separadores hasta que encuentre un carácter que no sea el separador, y en otra versión, los espacios (solo ellos) no juegan ningún papel y la expresión "%d + %d" es equivalente a "%d+%d".

Ejemplo de código C++
Ejemplo de código C++

Ejemplos

Veamos algunos ejemplos para ayudarte a pensar y comprender mejor cómo funciona la función.


scanf("%3s", cadena); //si ingresa la cadena "1d2s3d1;3" en la consola, solo se escribirá "1d2" en str scanf("%dminus%d", &x, &y); //los caracteres menos entre dos números serán descartados scanf("%5[0-9]", str); // los caracteres se ingresarán en str hasta que haya 5 caracteres y los caracteres sean números del 0 al 9. scanf("%lf", &d); //esperar entrada doble scanf("%hd", &x); //número esperado de tipo short scanf("%hu", &y); //esperar un número sin firmar short scanf("lx", &z); // número esperado de tipo long int

DesdeLos ejemplos a continuación muestran cómo cambia el número esperado usando diferentes símbolos.

scanf C - descripción para principiantes

Esta sección será útil para principiantes. A menudo es necesario tener a mano no tanto una descripción completa de scanf C como los detalles de cómo funciona la función.

  • Esta característica es algo obsoleta. Hay varias implementaciones diferentes en bibliotecas de diferentes versiones. Por ejemplo, la función scanf S C mejorada, cuya descripción se puede encontrar en el sitio web de microsoft.
  • El número de especificadores en el formato debe coincidir con el número de argumentos pasados a la función.
  • Los elementos del flujo de entrada deben estar separados solo por caracteres de separación: espacio, tabulador, nueva línea. Coma, punto y coma, punto, etc.: estos caracteres no son separadores para la función scanf().
  • Si scanf encuentra un carácter separador, se detendrá la entrada. Si hay más de una variable para leer, scanf pasará a leer la siguiente variable.
  • La más mínima inconsistencia en el formato de datos de entrada conduce a resultados impredecibles del programa. Bueno, si el programa simplemente termina con un error. Pero muchas veces el programa sigue funcionando y lo hace mal.
  • scanf("%20s…",…); Si el flujo de entrada supera los 20 caracteres, scanf leerá los primeros 20 caracteres y cancelará o pasará a leer la siguiente variable, si se especifica una. En este caso, la siguiente llamada a scanf continuará leyendo el flujo de entrada desde el punto donde se detuvo el trabajo de la llamada anterior a scanf. Si al leer los primeros 20caracteres, se encuentra un carácter delimitador, scanf abortará o continuará leyendo la siguiente variable, incluso si no leyó 20 caracteres para la primera variable. En este caso, todos los caracteres no leídos se adjuntarán a la siguiente variable.
  • Si el conjunto de caracteres escaneados comienza con "^", entonces scanf leerá los datos hasta que encuentre un carácter delimitador o un carácter del conjunto. Por ejemplo, "%[^A-E1-5]" leerá los datos de la secuencia hasta que se encuentre uno de los caracteres ingleses en mayúsculas de la A a la E o uno de los números del 1 al 5.
  • La función scanf C, como se describe, devuelve un número igual al número exitoso de escrituras en las variables. Si scanf escribe 3 variables, entonces el resultado exitoso de la función devolverá el número 3. Si scanf no pudo escribir ninguna variable, entonces el resultado será 0. Y, finalmente, si scanf no pudo iniciarse por alguna razón, el el resultado será EOF.
  • Si la función scanf() terminó incorrectamente. Por ejemplo, scanf("%d", &x): se esperaba un número, pero se recibieron caracteres como entrada. La siguiente llamada a scanf() comenzará en el punto del flujo de entrada donde finalizó la llamada de función anterior. Para superar este problema, es necesario deshacerse de los personajes problemáticos. Esto se puede hacer, por ejemplo, llamando a scanf("%s"). Es decir, la función leerá una cadena de caracteres y la desechará. De esta manera engañosa, puede continuar ingresando los datos necesarios.
  • En algunas implementaciones de scanf(), "-" no está permitido en el juego de caracteres escaneado.
  • El especificador "%c" lee cada carácter del flujo. Es decir, también lee el carácter separador. Para omitir el carácter delimitador y continuar leyendo el carácter deseado, puede utilizar "%1s".
  • Al usar el especificador "c", está permitido usar el ancho "%10c", pero luego se debe pasar una matriz de elementos de tipo char como variable a la función scanf.
  • “%[a-z]” significa “todas las letras minúsculas del alfabeto inglés”, y “%[z-a]” significa solo 3 caracteres: 'z', 'a', '-'. En otras palabras, el carácter "-" significa un rango solo si está entre dos caracteres que están en el orden correcto. Si "-" está al final de una expresión, al principio o en el orden incorrecto de los caracteres a ambos lados, entonces es solo un carácter de guión, no un rango.
código C++
código C++

Conclusión

Esto concluye la descripción de scanf C. Esta es una característica muy útil para trabajar en programas pequeños y cuando se utiliza el método de programación procedimental. Sin embargo, la principal desventaja es la cantidad de errores impredecibles que pueden ocurrir al usar scanf. Por lo tanto, la descripción de scanf C cuando la programación se mantiene mejor frente a sus ojos. En grandes proyectos profesionales, se utilizan iostreams, debido a que tienen capacidades de mayor nivel, son más capaces de detectar y manejar errores, y también trabajan con cantidades significativas de información. También se debe tener en cuenta que la descripción de scanf C en ruso está disponible en muchas fuentes de red, así como ejemplos de la misma.uso, debido a la antigüedad de la función. Por lo tanto, si es necesario, siempre puede encontrar la respuesta en los foros temáticos.