2013-01-23 22 views
8

Próbuję wykonać prosty program C dla klasy i jednym z wymagań jest to, że muszę używać scanf/printf dla wszystkich wejść i wyjść. Moje pytanie brzmi: dlaczego mój scanf po pętli for w głównej jest pomijany, a program właśnie kończy działanie.scanf Pomijanie

Oto mój kod

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

udało mi się „naprawić”, dodając kolejną identyczną scanf po pierwszym, ale wolałbym po prostu użyć jednego.

+1

Czy próbowałeś 'system (" PAUSE ");'? –

+0

jest dostępny w wersji prostej C lub tylko w C++? –

+0

Staight c. Zwróć uwagę na brak przestrzeni nazw? –

Odpowiedz

19

Znak nowej linii występujący w stdin po wprowadzeniu poprzedniego int nie zostanie wykorzystany przez ostatnie połączenie z scanf(). Tak więc wywołanie scanf() po pętli for pochłania znak nowej linii i kontynuuje bez konieczności wprowadzania niczego przez użytkownika.

Aby rozwiązać bez konieczności dodać inny scanf() połączenia można użyć formatu specyfikatora " %c" w scanf() po pętli for. Spowoduje to, że scanf() pominie wszystkie początkowe znaki odstępu (łącznie z nową linią). Uwaga: oznacza to, że użytkownik musi wprowadzić coś innego niż nowa linia, aby zakończyć program.

Dodatkowo:

  • sprawdzić wynik scanf() aby upewnić się, że faktycznie przypisuje wartości do zmiennych przekazywanych w:

    /* scanf() returns number of assigments made. */ 
    if (scanf("%d", &userValue) == 1) 
    
  • to zadanie (i zawsze będzie prawdą) :

    if (a = 1){ /* Use == for equality check. 
           Note 'a' could be removed entirely and 
           replace with: if (isPrime(x)) */ 
    
+1

Dlaczego nie zostałby zużyty przez ostatnie wywołanie funkcji 'scanf()'? Przepraszamy newb pytanie –

+2

@SSHThis, 'scanf ("% d ")' przestaje zużywać, gdy napotyka coś, co nie jest cyfrą, a nowa linia nie jest cyfrą, więc pozostanie. – hmjd

+0

dziękuję za złapanie tego błędu –