2013-01-23 4 views
8

私はクラスのためのシンプルなCプログラムを作成しようとしていますが、要件の1つは、入出力のすべてにscanf/printfを使用する必要があるということです。私の質問は、私のscanfがメインのforループの後にスキップされ、プログラムが終了するだけの理由です。scanfスキップする

は、ここに私のコード

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

私は最初の1の後に別の同一のscanfを追加することによって、それを「修正」することができましたが、私は1つだけ使用することを好むだろう。

+1

'system(" PAUSE ");'を試しましたか? –

+0

はストレートCまたはC++のみで利用できますか? –

+0

Staight c。名前空間がないことに注目してください。 –

答えて

19

以前intが入力された後stdinに存在する改行文字はscanf()への最後の呼び出しによって消費されていません。したがって、forループの後にscanf()を呼び出すと、改行文字が消費され、ユーザーは何も入力する必要がなくなります。

scanf()コールを追加せずに修正するには、forループの後にscanf()にフォーマット指定子" %c"を使用できます。これにより、scanf()は先頭の空白文字(改行を含む)をスキップします。これは、ユーザーがプログラムを終了するために改行以外のものを入力する必要があることに注意してください。さらに

  • それが実際に渡された変数に値を代入することを確認するためにscanf()の結果を確認してください。

    /* scanf() returns number of assigments made. */ 
    if (scanf("%d", &userValue) == 1) 
    
  • これは割り当てである(そして常にtrueになります) :

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

なぜ 'scanf()'の最後の呼び出しでそれが消費されていないのでしょうか?申し訳ありませんnewbの質問 –

+2

@SSHTこれは、数字ではないものに遭遇したときに 'scanf("%d ")'が消費されなくなり、改行は数字ではないので消えません。 – hmjd

+0

その誤りをキャッチしてくれてありがとう –