¿Qué necesita saber sobre el uso de la función scanf?
La función printf convierte enteros binarios, números de coma flotante, caracteres, cadenas, etc. Convierta a caracteres e imprímalos en la consola. En cambio, scanf convierte una cadena ingresada por teclado en una representación entera, de punto flotante, de carácter o binaria de la cadena de acuerdo con la especificación de conversión.
Después de ejecutar el programa, ingrese "1 2 3 4 5.6 7.8" en el teclado. La función scanf convierte la cadena "1 2 3 4 5.6 7.8" en varios datos binarios de acuerdo con la especificación de conversión y los almacena en variables.
La función printf convierte estas variables en cadenas de acuerdo con la especificación de conversión y las envía a la consola.
La fórmula de uso de 1. Función scanf
Scanf es una función de parámetro variable.
El primer parámetro de scanf es una cadena.
El contenido del primer parámetro de scanf es el carácter coincidente y la especificación de conversión.
El parámetro posterior de scanf es la ubicación de almacenamiento de los datos una vez completada la conversión.
El método de escritura y la cantidad de la especificación de conversión deben corresponder a los tipos y cantidades de parámetros posteriores.
1.1 scanf es una función de parámetro variable.
Al igual que printf, scanf también es una función de parámetro variable. Dijimos antes que el número y tipo de parámetros en una función variada no están definidos.
1.2 El primer parámetro de scanf es una cadena.
1.3 El primer parámetro de scanf es el carácter coincidente y la especificación de conversión.
Tenga en cuenta: debe ingresar la primera cadena al ingresar; de lo contrario, no se obtendrá el resultado correcto.
Ejemplo 1: la primera cadena de scanf es "hhd hd d ld f lf", con cada especificación de conversión separada por espacios. Luego, la entrada debe estar separada por espacios, como 1 2 3 4 5,6 7,8.
La primera cadena del scanf de ejemplo es "hhd, hd, d, ld, f, lf", cada especificación de conversión se utiliza y se divide. Luego, la entrada debe estar separada por comas, como 1, 2, 3, 4, 5,6, 7,8.
La primera cadena en el ejemplo scanf es "hhd hd-dxld/f\~lf", y la especificación de conversión usa -x/~division. Luego debes ingresar 1 2-3x4/5.6~7.8 así.
En resumen, scanf hará coincidir la cadena de entrada con el primer parámetro para encontrar la parte que necesita convertirse. Si falla la coincidencia de cadenas, no se obtendrán resultados de conversión correctos.
1.4 El parámetro posterior de scanf es la ubicación de almacenamiento de los datos una vez completada la conversión.
Scanf convierte la cadena de entrada de acuerdo con la especificación de conversión correspondiente, y el binario convertido se almacenará en la dirección variable de la entrada de parámetro posterior. Cuál es la dirección de la variable no se analiza aquí por el momento. Recuerde dos reglas:
Si scanf almacena el binario convertido en una variable base, agregue amp;. ?
Si scanf almacena una cadena en una matriz de caracteres, no es necesario agregar amp al amplificador de la matriz de caracteres.
1.5 El método de escritura y la cantidad de la especificación de conversión deben corresponder a los tipos y cantidades de parámetros posteriores.
2.¿Qué hace exactamente la función scanf?
2.1 Relaciona la cadena de entrada con el primer parámetro.
Primero, la función scanf lee la cadena de entrada. Luego, scanf hará coincidir esta cadena de entrada con la cadena del primer parámetro y encontrará una correspondencia uno a uno entre las subcadenas en la cadena de entrada y la especificación de conversión.
La subcadena "1" corresponde a la especificación de conversión "hhd", la subcadena "2" corresponde a la especificación de conversión "hd", la subcadena "3" corresponde a la especificación de conversión "d" y la subcadena "5.6 " corresponde a la especificación de conversión "f", subcadena "7.8".
2.2 Convertir caracteres a binario según la especificación de conversión.
El encadenamiento de conversión comienza después de que la subcadena coincide con la especificación de conversión. Scanf utilizará diferentes métodos de conversión para convertir la subcadena a binario de acuerdo con la especificación de conversión correspondiente a la subcadena.
Los modos de conversión representados por diferentes especificaciones de conversión son los siguientes:
Según la tabla anterior, los modos de conversión en nuestro ejemplo son los siguientes.
La subcadena "1" corresponde a la especificación de conversión "hhd" y se convertirá a una representación binaria de tipo char, con 1 byte. ?
La subcadena "2" corresponde a la especificación de conversión "hd" y se convertirá a la representación binaria del tipo corto, es decir, 2 bytes. ?
La subcadena "3" corresponde a la especificación de conversión "d", que se convertirá a una representación binaria de tipo int, con 4 bytes. ?
La subcadena "4" corresponde a la especificación de conversión "ld" y se convertirá a una representación binaria de tipo long, con 4 bytes. ?
La subcadena "5.6" corresponde a la especificación de conversión "f" y será convertida a una representación binaria de tipo float, con 4 bytes. ?
La subcadena "7.8" corresponde a la especificación de conversión "lf" y será convertida a una representación binaria de tipo double, con 8 bytes.
2.3 Poner el binario convertido en una variable.
Después de obtener los binarios convertidos, coloque estos binarios en variables en orden.
Debido a que utilizamos variables del tipo correspondiente para recibir los resultados de la conversión, podemos garantizar que la longitud y el tipo sean consistentes.
3. Varios tipos de demostraciones de errores
3.1 La longitud es correcta, pero el tipo es incorrecto.
Introducimos la cadena "123.45", que coincide con la especificación de conversión "lf".
A continuación, la cadena "123.456" se convertirá en una representación binaria de tipo doble, que tiene 8 bytes.
Finalmente, estos 8 bytes se envían a la variable de tipo long long ll.
Ahora la variable ll es un entero binario doble.
Si usamos d para imprimir ll, definitivamente habrá resultados incorrectos.
¿Qué tal imprimir con f? f obtendrá 8 bytes de binario y los convertirá de acuerdo con las reglas binarias de tipo doble. El resultado es el resultado correcto.
3.2 El valor de la cadena de entrada es mayor que el rango de valores del tipo de conversión.
Ingresamos la cadena "2147483467", que coincide con la especificación de conversión "hd".
A continuación, la cadena "2147483467" se convertirá en una representación binaria de tipo short, con 2 bytes.
El rango de valores del tipo corto es -32767~32768 y 2147483467 no se puede cargar en corto.
Como resultado, no se pueden obtener resultados correctos.
3.3 La variable no se ajusta al resultado de la transformación
Ingresamos la cadena "2147483467", que coincide con la especificación de transformación "d".
A continuación, la cadena "2147483467" se convertirá en una representación binaria de tipo int, que tiene 4 bytes.
Finalmente, los datos convertidos de 4 bytes son recibidos por la variable de tipo corto S y se pierden 2 bytes.
Como resultado, no se pueden obtener resultados correctos.
3.4 Cómo evitar errores
Ingresamos la cadena "2147483467", que coincide con la especificación de conversión "d".
A continuación, la cadena "2147483467" se convertirá en una representación binaria de tipo int, que tiene 4 bytes.
Finalmente, la variable n de tipo int recibe los datos convertidos de 4 bytes.
Resultado correcto.
Al utilizar scanf, tenga en cuenta que el valor numérico de la cadena de entrada debe coincidir con la especificación de conversión y el tipo de variable que recibe el resultado de la conversión para obtener resultados correctos.
4. Caracteres y cadenas
4.1 Ingresando caracteres
Intentemos ingresar un carácter.
Ingresamos la cadena "a" que coincide con la especificación de conversión "c".
A continuación, la cadena "a" se convertirá a una representación binaria de tipo char (su número decimal es 65), con 1 byte.
Finalmente, la variable C de tipo char recibe 1 byte de datos de conversión.
Cuando imprimimos c con d, el valor de salida es 65. Al imprimir con c, se genera el carácter c.
Si desea ingresar un valor numérico para el tipo char, use la especificación de conversión hhd. Si todavía usa la especificación de conversión c. El código ASCII del primer carácter se carga en la variable.
4.2 Cadena de entrada
No existe una variable de cadena en lenguaje C y las cadenas se almacenan en matrices de caracteres.
Debido a que la cadena de entrada aquí se almacena en una matriz de caracteres, los siguientes parámetros str amp;
Aún no se han discutido las matrices, por lo que no continuaremos ampliando esta parte por el momento.
5.VS no puede utilizar la función scanf.
Si está utilizando una versión más reciente de Visual Studio, funciones como scanf se consideran inseguras y el compilador arrojará un error C4996 y le recomendará que utilice otras funciones seguras.
Sin embargo, no queremos presentar ni discutir esta característica de seguridad en este momento. Agregue _CRT_SECURE_NO_WARNINGS a la cadena predefinida para enmascarar errores de funciones no seguras.
Agregue los siguientes pasos:
En Solución, haga clic derecho en el proyecto e ingrese propiedades.
Amplíe C/C y seleccione Preprocesador.
Haga clic en Editar definición de preprocesador.
Agregue _CRT_SECURE_NO_WARNINGS a la definición del preprocesador.
6. La diferencia entre scanf y printf
No agregar a los parámetros posteriores de printf. Scanf requiere una dirección, por lo que es necesario agregar amp;
Dado que la variable es más pequeña que int, los parámetros de printf se actualizarán a int y float se actualizarán a double. Por lo tanto, la especificación de conversión d se puede utilizar para char, short e int. La especificación de conversión f está disponible para flotante y doble. Sin embargo, scanf envía directamente el resultado de la conversión a la variable receptora y debe utilizar estrictamente la especificación de conversión.