variable usar una recorrer leer imprimir como caracteres cadenas cadena arreglo c scanf

usar - recorrer una cadena en c



¿Cuál es el efecto del espacio en blanco al final en una cadena de formato scanf()? (4)

La diferencia (aunque obvia) es una cadena de formato diferente. Si ingresas la siguiente línea:

"3 "

scanf() regresará con éxito. De lo contrario, depende de su entrada proporcionada. scanf() esencialmente se salta el espacio en blanco (pestañas, espacios, líneas nuevas) y busca valores alfanuméricos en la corriente de entrada. Como esto es un espacio en blanco al final, se suma con el carácter de nueva línea al final de la entrada al presionar ENTER , por lo que tiene poca importancia.

scanf() espera que la entrada proporcionada coincida exactamente con la cadena de formato que le proporcione, con la excepción de que los caracteres contiguos de espacios en blanco se comprimen en un solo carácter de espacio en blanco. Esto se vuelve muy importante si quiere analizar grandes cadenas de datos con su equivalente de procesamiento de cadenas, sscanf() .

Un buen ejercicio para probar más esto sería algo como:

#include<stdio.h> int main(void) { int a=0,b=0,c=0; printf("Enter values for A, B, C, in the format: /"A B - C/"/n"); scanf("%d %d - %d", &a, &b, &c); printf("Values: A:%d, B:%d, C:%d/n", a, b, c); }

Luego, verifique y vea cuáles son los valores de estos enteros después de proporcionar una entrada con el formato correcto e incorrecto (es decir, espacios y guiones). Aquí hay un par de ejecuciones de ejemplo. El primero usó la entrada incorrecta, el segundo utilizó la entrada formateada correctamente. Observe que en el primer caso, C ni siquiera se establece, ya que scanf() proporcionará un comportamiento inesperado si la entrada y las cadenas de formato no coinciden. En general, es mejor usar algo como fgets() para obtener una cadena de entrada del usuario, y luego usar varias funciones de búsqueda (por ejemplo: strstr (), strch (), strcat, strcpy, etc.) para analizar su cadena , ya que es mucho más seguro que el simple uso de scanf() y suponiendo que el usuario no se equivocará, accidental o deliberadamente.

Enter values for A, B, C, in the format: "A B - C" 1 2 3 Values: A:1, B:2, C:0 Enter values for A, B, C, in the format: "A B - C" 1 2 - 3 Values: A:1, B:2, C:3

Ahora, considere una última ejecución: verá que scanf() compacta múltiples caracteres de espacio en blanco consecutivos con un solo carácter, por lo que estas ejecuciones finales realmente tienen éxito:

Enter values for A, B, C, in the format: "A B - C" 1 2 - 3 Values: A:1, B:2, C:3 Enter values for A, B, C, in the format: "A B - C" 1 2 - 3 Values: A:1, B:2, C:3

¿Cuál es la diferencia entre scanf("%d") y scanf("%d ") en este código, donde la diferencia es el espacio en blanco posterior en la cadena de formato?

#include <stdio.h> int main(void) { int i, j; printf("enter a value for j "); scanf("%d ",&j); printf("j is %d/n", j); printf("enter a value for i "); scanf("%d", &i); printf("i is %d/n", i); return 0; }

¿Cómo funciona realmente la función scanf() cuando agrego espacios después del especificador de formato como scanf("%d ", &j); ?


Un carácter de espacio en blanco en su formato de scanf coincide con cualquier número de caracteres de espacio en blanco como se describe en isspace . Por lo tanto, si tiene espacios de seguimiento, nuevas líneas, tabuladores o cualquier otro carácter de espacio en blanco, también será consumido por scanf antes de que regrese.


Un carácter de espacio en blanco (espacio, nueva línea, pestaña horizontal y vertical) en una cadena de formato coincide con cualquier cantidad de caracteres de espacio en blanco en la entrada.
En tu primer caso

scanf("%d ",&j);

cuando encuentra el char del espacio en blanco (WSC) '' '' , comerá todos los espacios en blanco ingresados ​​por el usuario incluyendo /n al presionar Enter y esperará ingresar a un CSM que no sea WSC. En este caso, su programa terminará presionando Ctrl + Z.


Un carácter de espacio en blanco en formato de escaneo hace que lea explícitamente e ignore tantos caracteres de espacio en blanco como sea posible. Entonces con scanf("%d ", ... , después de leer un número, continuará leyendo caracteres, descartando todos los espacios en blanco hasta que vea un carácter que no sea de espacio en blanco en la entrada. próximo carácter para ser leído por una función de entrada.

Con tu código:

printf("enter a value for j "); scanf("%d ",&j); printf("j is %d /n", j);

imprimirá la primera línea y luego esperará a que ingrese un número, y luego continúe esperando algo después del número. Por lo tanto, si solo escribe 5 Enter , parecerá que se colgó: debe escribir otra línea con un carácter que no sea de espacio en blanco para continuar. Si luego escribe 6 Enter , ese será el valor de i , por lo que su pantalla se verá algo así como:

enter a value for j 5 6 j is 5 enter a value for i i is 6

Además, dado que la mayoría de scanf% -conversiones también omiten espacios en blanco iniciales (todos excepto %c , %[ y %n ), los espacios antes de % -conversiones son irrelevantes ( "%d" y " %d" actuarán de forma idéntica). Por lo tanto, en su mayor parte, debe evitar espacios en las conversiones de escaneo a menos que sepa que los necesita específicamente por su efecto peculiar.