2013-01-23 6 views
8

Sto cercando di creare un semplice programma C per una classe e uno dei requisiti è che sono obbligato a utilizzare scanf/printf per tutti gli input e output. La mia domanda è: perché il mio scanf dopo il ciclo for nella main viene saltato e il programma termina.scanf Getting Skipped

Ecco il mio codice

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

ero in grado di "fissare" con l'aggiunta di un altro identico scanf dopo la prima, ma io preferirei usare solo quello.

+1

Hai provato 'system (" PAUSE ");'? –

+0

è disponibile in C lineare o solo in C++? –

+0

Staight c. Si noti la mancanza di uno spazio dei nomi? –

risposta

19

Il carattere di nuova riga presente nello inserito non è stato utilizzato dall'ultima chiamata a scanf(). Quindi la chiamata a scanf() dopo il ciclo for consuma il carattere di nuova riga e continua senza che l'utente debba immettere nulla.

Per correggere senza dover aggiungere un altro scanf() chiamata è possibile utilizzare di formato " %c" nel scanf() dopo il ciclo for. Questo farà sì che scanf() salti tutti i principali caratteri di spaziatura (inclusa la nuova riga). Nota significa che l'utente dovrà inserire qualcosa di diverso da una nuova riga per terminare il programma.

Inoltre:

  • controllo del risultato scanf() per assicurarsi che effettivamente assegna un valore alle variabili passate in:

    /* scanf() returns number of assigments made. */ 
    if (scanf("%d", &userValue) == 1) 
    
  • questo è un compito (e sarà sempre vero) :

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

Perché non sarebbe stato consumato dall'ultima chiamata a 'scanf()'? Spiacente domanda newb –

+2

@SSHQuesto, 'scanf ("% d ")' smette di consumare quando incontra qualcosa che non è una cifra, e una nuova riga non è una cifra, quindi rimarrà. – hmjd

+0

grazie per aver catturato quell'errore –