austin davis
Estoy tratando de hacer un programa C simple para una clase y uno de los requisitos es que debo usar scanf
/printf
para todas las entradas y salidas. Mi pregunta es ¿por qué mi scanf
después de que se omita el bucle for en el main y el programa simplemente termine.
Aquí está mi código
#include <stdio.h>
void main() {
int userValue;
int x;
char c;
printf("Enter a number : ");
scanf("%d", &userValue);
printf("The odd prime values are:\n");
for (x = 3; x <= userValue; x = x + 2) {
int a;
a = isPrime(x);
if (a = 1) {
printf("%d is an odd prime\n", x);
}
}
printf("hit anything to terminate...");
scanf("%c", &c);
}
int isPrime(int number) {
int i;
for (i = 2; i < number; i++) {
if (number % i == 0 && i != number)
return 0;
}
return 1;
}
Pude “arreglarlo” agregando otro idéntico scanf
después del primero, pero preferiría usar solo uno.
hmjd
El carácter de nueva línea presente en stdin
después del anterior int
ingresado no habrá sido consumido por la última llamada a scanf()
. Entonces la llamada a scanf()
después de la for
loop consume el carácter de nueva línea y continúa sin que el usuario tenga que ingresar nada.
Para corregir sin tener que añadir otro scanf()
llame, podría usar el especificador de formato " %c"
en el scanf()
después de la for
círculo. esto hará scanf()
omita cualquier carácter de espacio en blanco inicial (incluida la nueva línea). Tenga en cuenta que significa que el usuario tendrá que ingresar algo que no sea una nueva línea para finalizar el programa.
Además:
-
comprobar el resultado de
scanf()
para asegurarse de que realmente asigne un valor a las variables pasadas:/* scanf() returns number of assigments made. */ if (scanf("%d", &userValue) == 1)
-
esta es una tarea (y siempre será cierta):
if (a = 1){ /* Use == for equality check. Note 'a' could be removed entirely and replace with: if (isPrime(x)) */
-
¿Por qué no habría sido consumido por la última llamada a
scanf()
? Perdón nueva pregunta– SSH Esto
23 de enero de 2013 a las 16:31
-
@SSHEsto,
scanf("%d")
deja de consumir cuando encuentra algo que no es un dígito, y una nueva línea no es un dígito, por lo que permanecerá.– hmjd
23 de enero de 2013 a las 16:32
-
gracias por detectar ese error
– Austin Davis
23 de enero de 2013 a las 16:34
-
Gracias, debería ser
scanf("%d\n", &userValue);
?– SSH Esto
23 de enero de 2013 a las 16:34
-
@SSH Esto, sí. Eso también funcionaría.
– hmjd
23 de enero de 2013 a las 16:39
Has probado
system("PAUSE");
?– Cole Tobin
23 de enero de 2013 a las 17:34
¿Está disponible en C puro o solo en C++?
– Austin Davis
23 de enero de 2013 a las 18:12
Recta c. ¿Notas la falta de un espacio de nombres?
– Cole Tobin
23 de enero de 2013 a las 21:24