Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

scanf Getting Skipped [duplicate]

Tags:

c

scanf

I am trying to make a simple C program for a class and one of the requirements is that I'm required to use scanf/printf for all input and output. My question is why is it that my scanf after the for loop in the main gets skipped and the program just terminates.

Here is my code

#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;
}

I was able to "fix" it by adding another identical scanf after the first one, but I would prefer to just use the one.

like image 988
Austin Davis Avatar asked Jan 23 '13 16:01

Austin Davis


1 Answers

The new-line character present in stdin after the previous int was entered will not have been consumed by the last call to scanf(). So the call to scanf() after the for loop consumes the new-line character and continues without the user having to enter anything.

To correct without having to add another scanf() call you could use format specifier " %c" in the scanf() after the for loop. This will make scanf() skip any leading whitespace characters (including new-line). Note it means the user will have to enter something other than a new-line to end the program.

Additionally:

  • check the result of scanf() to ensure it actually assigns a value to the variables passed in:

    /* scanf() returns number of assigments made. */
    if (scanf("%d", &userValue) == 1)
    
  • this is an assignment (and will always be true):

    if (a = 1){ /* Use == for equality check.
                   Note 'a' could be removed entirely and
                   replace with: if (isPrime(x)) */
    
like image 177
hmjd Avatar answered Oct 22 '22 07:10

hmjd