Red de conocimiento informático - Conocimiento sistemático - Si está familiarizado con TC, entre (una pregunta muy básica)

Si está familiarizado con TC, entre (una pregunta muy básica)

Cámbielo a scaf ("%f", &x) y simplemente hágalo. Debes haber comenzado a aprender tc.

Lea este párrafo:

La cadena de control de la función scanf()

Nombre de la función: scanf

Función: realizar formato enter .

Uso: int scanf (char * format [, parámetros,...]);

La función scanf() es una función de entrada formateada de terminal general, que lee datos del dispositivo de entrada estándar (teclado) Lee la información de entrada. Puede leer datos de cualquier tipo nativo y convertir automáticamente el valor al formato integrado apropiado.

Su formato de llamada es: scanf(",& ltaddress table>);

La función scanf() devuelve el número de elementos de datos asignados correctamente y devuelve EOF cuando hay un error

Su cadena de control consta de tres tipos de caracteres:

1. Especificador de formato

2.

(a) Especificador de formato

Descripción del carácter del formato

%a lee valores de punto flotante (solo válido para C99)

%A Igual que arriba

%c lee un carácter

%d lee un número entero decimal

%i Lee números enteros decimales, octales y hexadecimales

%o lee enteros octales

%x lee enteros hexadecimales

% X Igual que arriba

%c lee un carácter

%s lee una cadena.

%f lee un número de punto flotante

%F Igual que arriba

%e Igual que arriba

%E Igual que arriba

%g Igual que arriba

%G Igual que arriba

%p lee el puntero

%u lee un entero decimal sin signo

% n es el número de caracteres equivalente al valor leído actualmente

% []Escanear conjunto de caracteres

Símbolo %% Read%

Tabla de caracteres de descripción de formato adicional

Descripción del modificador

El modificador de longitud L/l ingresa datos "largos". p>El modificador de longitud ingresa datos "cortos".

La constante entera w especifica el ancho de los datos de entrada. >*El asterisco indica que los datos están en blanco

Hh. Todos son iguales que h, l, pero solo son válidos para C99.

(b) Los caracteres en blanco hacen que la función scanf() ignore uno o más caracteres de espacio en blanco en la entrada hasta el primer carácter que no sea. aparece un carácter de espacio en blanco.

(c) Caracteres que no son espacios en blanco

Los caracteres que no son espacios en blanco harán que la función scanf() excluya caracteres que sean iguales a los caracteres que no sean espacios en blanco. lectura.

Nota: scanf() El conocimiento sobre el control de cadenas se ha introducido aquí (debería ser relativamente completo, si hay alguna omisión, la agregaré la próxima vez). por uno basado en la rutina real

En tercer lugar, la función scanf() Uso de cadenas de control

Ejemplo 1.

#Contiene "stdio.h. "

int main(void)

{

int a, b, c;

scanf("%d%d% d ", & amp uno, & ampb & amp; c);

printf("%d,%d,%d\n ",a,b,c);

Devuelve 0;

}

Entrada en tiempo de ejecución Los siguientes tres valores:

3□4□5 ↙(Ingrese los valores de a, by c)

3, 4, los valores de a, b y c generados por printf)

(1)&A, A&b, &&&in c; , que obtiene las direcciones de memoria de estas tres variables respectivamente.

(2) "%d %d %d" es para ingresar tres valores en formato decimal.

Al escribir, puede utilizar uno o más espacios, la tecla de tabulación y la tecla Intro para separar dos datos.

Los siguientes son métodos de entrada legales:

① 3□□4□□□□5↙

② 3↙

4 □5↙

③ 3 (tecla de tabulación) 4↙

5↙

Ejemplo 2.

#Contiene "stdio.h"

int main(void)

{

int a, b, c;

p>

scanf("%d,%d,%d",&one,&b&c);

printf("%d,%d,%d\n ", a, b, c);

Devuelve 0;

}

Ingrese los siguientes tres valores durante el tiempo de ejecución:

3 ,4,5 ↙(Ingrese los valores de a, b y c)

o

3,□4,□5 ↙(Ingrese los valores de a, b y c)

p>

3, □□□□□ 4, □ 5 ↙(Ingrese los valores de a, b y c)

......

Todo es Legal, pero "," debe seguir al número, como por ejemplo:

3□, 4□ y 5 ↙ son ilegales y el programa es equivocado. (La solución y el motivo se discutirán más adelante)

Otro ejemplo es:

Las variables en 1 y sacnf() deben usar direcciones.

int a, b;

scanf("%d%d ", a, b // Error

scanf("%d%d); ", &a, &b);

2. La cadena de control de formato de scanf() puede usar otros caracteres que no sean espacios en blanco, pero estos caracteres deben ingresarse al ingresar.

Ejemplo:

scanf("%d, %d ", & amp一, & ampb

Entrada: 3, 4 ↙ (coma correspondiente); coma en "%d,%d")

scanf("a=%d,b=%d",&one,&b);

Ingrese: a=3, b =4 ↙("a=","b=", la coma corresponde a la coma en "a=", "b=" y "%d,%d".

3 . Al usar La entrada "%c", los espacios y los "caracteres de escape" son caracteres válidos

Ejemplo:

scanf("%c%c%c ", & ampc. 1; c2 y ampC3 );

Entrada: a□b□c↙

Resultado: a→c1, □→c2, b→c3 (otros se descartan)

Cuando la función scanf() recibe datos de entrada, finaliza la entrada de datos en las siguientes circunstancias: (En lugar de finalizar la función scanf, la función scanf solo tiene datos en cada campo de datos y finaliza después de presionar Enter)

.

①Si hay espacios, las teclas "Entrar" y "Omitir"

(2) Cuando finaliza el ancho

③Entrada ilegal. Eso es todo por el último artículo. La rutina del tercer cuarto fue “copiada” de un tutorial en Internet (por dos razones: primero, se puede jugar mucho menos. Segundo, no sé cómo hacerlo). . Play. _), y elimine los errores. Por cierto, los lectores de este artículo deben hacer todo por sí mismos, incluso los libros clásicos inevitablemente tendrán omisiones, así que deje que el compilador le diga si está bien o mal.

He expresado dos opiniones en el artículo anterior y las reiteraré nuevamente: 1. Este artículo solo analiza la aplicación de la función scanf() para controlar cadenas, y no se analizan todas las rutinas en el artículo. constituyen consejos de programación 2. Haga todo usted mismo. Diferentes plataformas y compiladores pueden tener resultados diferentes. Todas las rutinas de este artículo se depuran en WIN-TC+windows.

Pregunta: ¿La función scanf() no puede aceptar correctamente cadenas con espacios? Tales como: ¡Te amo!

# include & ltstdio.h & gt

int main()

{

String[80];

scanf("%s ", str);

printf("%s ", str);

Devuelve 0;

}< / p>

Inversión: ¡Viviré contigo!

Salida: I

Cuando la función scanf() recibe datos de entrada, finaliza la entrada de datos en las siguientes circunstancias: (En lugar de finalizar la función scanf, la función scanf solo hay datos en cada campo de datos y finaliza después de presionar Enter).

① Si hay espacios, presione las teclas "Enter" y "Skip".

(2)Cuando termina el ancho.

③Entrada ilegal.

Por lo tanto, la solución anterior no puede lograr el propósito esperado. Cuando scanf() escanea el espacio después de "I", considera que la asignación de str ha finalizado y se ignora el siguiente "¡Te amo!". Preste atención aquí, ya sea en "¡Te amo!" o en el búfer del teclado (vi lo mismo en Internet, pero después de la depuración, descubrí que el primer y el último puntero de la cadena almacenada en el búfer son iguales en este momento, lo cual significa que el búfer está vacío. Sí, la función scan() solo debe escanear el flujo estándar, esta información residual está en la entrada estándar). Cambiemos el programa anterior para verificarlo:

# include & ltstdio.h & gt

int main()

{

Cadena[80];

char str 1[80];

char str 2[80];

scanf("%s ", str); /*Entra aquí: ¡Te amo! */

printf("%s ", str);

Sleep(5);/*Espera aquí 5 segundos y te indica dónde se está ejecutando el programa*/

scanf("%s ", str 1); /*Ya no necesitas ingresar estas dos oraciones, simplemente escanea el búfer del teclado nuevamente*/

scanf("%s ", str 2 ); /*Ya no necesitas ingresar estas dos oraciones, simplemente escanea el búfer del teclado nuevamente*/

printf("\n%s ", str 1);

printf( "\n%s ", str 2);

Devuelve 0;

}

Entrada: ¡Te amo!

Salida:

¡Te amo!

Bien, se conoce el motivo, entonces, ¿puede la función scanf() completar esta tarea? La respuesta es: ¡sí! No olvide la función scanf() y el controlador de formato %[] (si no conoce %[], consulte la primera parte de este artículo). Consulte el siguiente programa:

#Contains "stdio.h"

int main()

{

cadena de caracteres[50] ;

/*scanf("%s ", cadena); No se pueden aceptar caracteres de espacio*/

scanf("%[^\n]", cadena);

p>

printf("%s\n ", string);

Devuelve 0;

}

Pregunta 3: Información residual del búfer del teclado problema.

# include & ltstdio.h & gt

int main()

{

int a;

char c;

hacer

{

scanf("%d ", & ampa);

scanf("%c ",&c);

printf("a=%d c=%c\n ",a,c);

/*printf("c=%d\n " , c);*/

} while(c!= ' N ');

}

scanf("%c ", & ampc); Esta oración no puede recibir caracteres normalmente. ¿Cuál es la razón? Usamos printf("c=%d\n ", c); usamos int para representar c, habilitamos printf("c=%d\n ", c); C, el resultado es C = 10 y el valor ASCII es 10. ¿Qué es esto? El carácter de nueva línea significa \n. Por cierto, cada vez que presionamos la tecla "Entrar", enviamos un "Entrar" (\r) y un "avance de línea" (\n) al búfer del teclado, donde está \r. enviado por los identificadores de la función scanff () (pensemos en ello _), mientras que \n se escanea ().

Solución: Puede agregar fflush(stdin) después de las dos funciones scanf(); y agregar getch(); está bien, pero depende de la declaración scanf() específica que se agregue. No lo analizaré aquí, los lectores pueden explorarlo ellos mismos. Pero agregue fflush(stdin); no importa cuál sea la situación, es factible.

Nombre de la función: fflush

Energía de trabajo: Limpiar un arroyo.

Uso: int fuzzy(archivo * flujo);

# include & ltstdio.h & gt

int main()

{

int a;

char c;

hacer

{

scanf("%d " , & ampa);

fflush(stdin);

scanf("%c ", & ampc);

fflush(stdin);

printf("a=%d c=%c\n ",a,c);

}mientras(c!= ' N ');

}

Aquí hay otro ejemplo del uso del "carácter de espacio" para procesar la información restante en el búfer:

Ejecute el programa incorrecto:

# include & ltstdio. h & gt

int main()

{

int I;

char j;

para ( I = 0;i<10;i++)

{

scanf("%c ", & ampj /*Aquí no hay espacio antes de %*/

);

}

}

Después de usar caracteres de control de espacio:

# include & ltstdio.h & gt

int main( )

{

int I;

char j;

for(I = 0;i<10;i++)

{

scanf(" %c ", & ampj);/*Tenga en cuenta que hay un espacio antes de % */

}

}

Puedes ejecutarlo para ver las diferencias entre los dos programas.

Pregunta 4: ¿Cómo lidiar con el estancamiento del programa o los errores causados ​​por errores de entrada en la función scanf()?

# incluir & ltstdio.h & gt

int main()

{

int a, b, c /*; Calcular a+b*/

scanf("%d, %d ", & amp一, & ampb

c = a+b; >printf("%d+%d=%d ",a,b,c);

}

Igual que el programa anterior, si los valores de A y B se ingresan correctamente, no hay problema. Sin embargo, no puede garantizar que los usuarios escriban correctamente siempre. Una vez que ingrese el tipo incorrecto, su programa se bloqueará o obtendrá resultados incorrectos. Jaja, este puede ser un problema que todos hayan encontrado.

Solución: Cuando la función scanf() se ejecuta correctamente, el valor de retorno es el número de variables leídas correctamente. Es decir, su función scanf() tiene varias variables. Si todas las funciones scanf() se leen normalmente, devolverá varias variables. Sin embargo, hay otra cuestión que destacar aquí. Si se ingresan datos ilegales, puede ocurrir el problema de información residual en el búfer del teclado.

Programa correcto:

# include & ltstdio.h & gt

int main()

{

int a, b, c;/*Calcular a+b*/

while(scanf("%d,%d ",&一,&b)!= 2)fflush(stdin ); /p>

c = a+b;

printf("%d+%d=%d ", a, b, c

}

);