>

scanscan에 문자를 입력 할 때이 루프에 문제가 있습니다. 루프는 멈추지 않습니다. 하지만 숫자를 입력하면 모두 잘 작동합니다.

이것은 코드입니다 :

#include <stdio.h>
#include <stdlib.h>
int main() {
    int x;
    printf("Enter 1 Or 2\n");
    scanf("%i",&x);
    while (x!=1 && x!=2) {
        printf("Please Enter A Right Value \n");
        scanf("%i",&x);
    }
    printf("Finish");
}


  • 답변 # 1

    글자 입력시 scanf  실제로 stdin 에서 잘못된 문자 입력을 얻으려고 시도합니다.  그러나 변환 사양에 따라 다르기 때문에 실패합니다. 그런 다음 stdin에 잘못된 입력을 유지합니다. 그리고 다음에 scanf  잘못된 입력으로 인해 다시 실패합니다. 따라서 scanf 를 사용하여 입력을 다시 얻으려고 시도하기 전에 지우십시오. . 또한 scanf 의 반환 값을 확인하십시오  그리고 stdin 를 지우지 못한 경우 .

    제공된 코드는 EOF 를 확인합니다.  또한 scanf 의 값을 반환  표준은 scanf 의 반환 값에 대해 명시 적으로 말합니다.  :-

    7.21.6.2p16

    와이즈 비즈 와이즈 비즈  이 함수는 매크로

    The 의값을 반환합니다.  만약에   첫 번째 변환 (있는 경우) 전에 입력 실패가 발생합니다.   완료. 그렇지 않으면함수는 입력 수를 반환합니다   할당 된 항목으로 제공되는 것보다 적거나   조기 일치 오류가 발생하는 경우 0.

    코드는this와 같습니다. (이것은 fscanf 를 사용하고 있습니다 ).

    더 나은 EOF 를 사용 . 잘못된 입력을 쉽고 효과적으로 제어 할 수 있습니다. scanf 와 함께  전체 줄을 읽은 다음 fgets 를 사용하여 정수 입력을 구문 분석합니다.  또는 fgets . 정수 입력의 경우 예도 있습니다-구문 분석 된 long 또는 unsigned long이 strtol 에 보관 될 수 있도록 적절한 크기인지 확인해야합니다  변수.

    strtoul

  • 이전 azure - "Rest"API와 "Graph"API의 차이점
  • 다음 vue.js - vuex 및 laravel 5 - 기사에서 태그를 제거하는 방법