2017-11-05 9 views
1

'b', -2 등의 잘못된 입력을 던져 넣는 것처럼 입력이 제대로되어 있는지 확인해야합니다. 간단한 코드, 확인 방법 그것은 :부호없는 long long의 적절한 입력을 확인하는 동안 음수 오류가 발생했습니다.

#include <stdio.h> 

int main() 
{ 
    unsigned long long bigNumber; 
    if(scanf("%llu", &bigNumber) == 0) 
     printf("Input error!"); 
    else 
     printf("%llu\n", bigNumber); 

    return 0; 
} 

그러나 때 입력

내가이 출력있어
-2 

:

18446744073709551614 

잘못이다, 왜냐하면 -2는 부호없는 long long이 아니기 때문입니다. 그래서

ex.c:6:52: error: comparison of unsigned expression < 0 is always false 
     [-Werror,-Wtautological-compare] 
     if((scanf("%llu", &bigNumber) == 0) || (bigNumber < 0)) 
               ~~~~~~~~~^~ 
1 error generated. 

가에있는 경우, 어떻게 제대로 내 큰 번호를 확인합니까 : 나는 놀랍게도

if((scanf("%llu", &bigNumber) == 0) || (bigNumber < 0)) 

에 입력 조건을 변경했을 때

, 내가 컴파일 오류가 발생했습니다 0 - 10^19 사이의 정수 여야합니까?

+1

'fgets'와 같이 문자열로 입력 한 다음'-'로 시작하는지 확인한 다음'sscanf' 또는'strtoull'을 확인하십시오. – BLUEPIXY

답변

0

C99 표준에서 입력 값 빼기 부호는 선택 사항이므로 빼기 부호를 읽으면 오류가 발생하지 않고 결과는 음수의 2의 보수, 매우 큰 값이됩니다. (Wikipedia)

부호가있는 번호를 읽고 x < 0을 확인하거나 읽지 않은 부호있는 값을 비교하기 전에 부호로 변환해야합니다.