2013-01-23 3 views
8

클래스 용으로 간단한 C 프로그램을 만들려고하고 있는데 그 중 하나는 모든 입력과 출력에 scanf/printf을 사용해야한다는 것입니다. 내 질문에 왜 내 scanf 메인에 대한 루프 후 건너 뛰고 프로그램이 그냥 종료됩니다.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; 
} 

내가 처음 한 후에 다른 동일한 scanf를 추가하여 "수정"할 수 있었다,하지만 난 그냥 하나를 사용하는 것을 선호합니다.

+1

'system ("PAUSE");'시도 했습니까? –

+0

은 C 또는 C++에서만 사용할 수 있습니까? –

+0

Staight c. 네임 스페이스가 없다는 것을 알아 차 리자. –

답변

19

int이 입력 된 후 stdin에있는 개행 문자는 scanf()의 마지막 호출에서 소비되지 않습니다. 따라서 for 루프 다음에 scanf()을 호출하면 줄 바꿈 문자가 소비되고 사용자가 아무 것도 입력하지 않아도 계속됩니다.

당신이 for 루프 후 scanf()에서 형식 지정자 " %c"를 사용할 수있는 또 다른 scanf() 호출을 추가 할 필요없이 해결하려면. 이렇게하면 scanf()은 공백 문자 (줄 바꿈 포함)를 건너 뜁니다. 이것은 사용자가 프로그램을 끝내기 위해 새 줄 이외의 다른 것을 입력해야한다는 것을 의미합니다.

는 또한 :

/* scanf() returns number of assigments made. */ 
if (scanf("%d", &userValue) == 1) 
  • 이 할당 (그리고 항상 true가됩니다) : scanf()의 결과가 보장

    • 검사가 실제로 전달 된 변수에 값을 할당 :

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

    'scanf()'에 대한 마지막 호출에 의해 왜 소비되지 않았을까요? 죄송합니다 newb 질문 –

    +2

    @SSHThis이 경우,'scanf ("% d")'는 숫자가 아닌 것을 발견했을 때 소비를 멈추고 새 줄은 숫자가 아니 어서 그대로 남습니다. – hmjd

    +0

    그 실수를 잡아 주셔서 감사합니다 –