2017-09-28 10 views
1

양수 만 읽고 (unsigned long long) 아무 것도 없으므로 scanf("%llu", &num);을 사용합니다. 하지만 음수 값을 입력 할 수도 있습니다.
이 경우 양수를 확인하는 방법은 무엇입니까? 사용자는 [0..2^(64) -1]에 양수를 입력해야하지만 같은 간격으로 음수 값을 입력하면 입력 할 수 있습니다. 그러나 나는 long long 변수를 선언 할 수 없다. 2^64 - 1을 포함 할 수있다.입력 된 번호가 양수인지 확인하는 방법은 무엇입니까?

+4

읽기 A * 문자열 *로 (예를 들어 '사용는 fgets ()') 그리고 그것에 대한 검증을하십시오. – usr

+1

죄송 합니다만 Imma noobie in C ... 어떻게 문자열을'unsigned long long'으로 변환 할 수 있습니까? –

+0

[오류 처리 기능이있는 uint64_t 캐스팅 문자열] (https://stackoverflow.com/q/46325780/2410359)을 참조하십시오. – chux

답변

1

당신은, fgets()를 사용하여 문자 배열로 입력을 읽은 첫 번째 문자가 - 심볼unsigned long long로 변환 strtoull()를 사용하여 다음 숫자 이외의 문자를했습니다 있는지 확인 할 수있다.

char c, buff[100]; 
fgets(buff, sizeof(buff), stdin); 
//sscanf(buff, "%*[ ]%c", &c); 
sscanf(buff, "%s", buff); 
//if((c<'0' || c>'9')) 
if(buff[0]<'0' || buff[0]>'9') 
{ 
    printf("\nNegative or invalid number!"); 
} 
else 
{ 
    num=strtoull(buff, NULL, 10); 
}  

strtoull()ULLONG_MAX이 (limits.h에 정의) 돌아가서에 의해 반환되는 값이 unsigned long long에 맞지 않을 경우 errnoERANGE에가 (이를 사용, errno.h 헤더 파일이 포함되어야합니다)을 설정합니다.

if(num==ULLONG_MAX && errno==ERANGE) 
{ 
    printf("\nOverflow"); 
} 

sscanf()%*[ ]

는 문자열에서 최고의 공백을 무시하는 데 사용됩니다. 첫 번째 비 공백 문자가 발견되어 값이 확인 된 c에 저장됩니다.

설명대로 here, sscanf(buff, "%s", buff);은 공백을 없애기 위해 양쪽에 문자열 buff을 자릅니다.

2

숫자를 fgets()으로 문자열로 읽은 다음이를 확인하십시오. strchr(). 읽은 값이 부호 오래 오래 INT에 의해 표현 가능한 값의 범위를 벗어나면

, 함수가 ULLONG_MAX를 반환 번호가 범위를 벗어나면 마지막으로 실패 문자열을 숫자로 변환 할 strtoull()를 사용 ( <limits.h>에 정의), errnoERANGE으로 설정됩니다.

예 :

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(void) { 
    char str[100]=; 
    fgets(str, sizeof(str), stdin); 
    str[strcspn(str, "\n")] = '\0'; 

    if(strchr(str, '-') == NULL) { 
     printf("Not a negative number\n"); 
     unsigned long long number = strtoull (str, NULL, 10); 
     printf("%llu\n", number); 
    } else { 
     printf("Negative number\n"); 
    } 

    return 0; 
} 

출력 :

Not a negative number 
12343566 

및 대 -12343566 그것이 제공 :

Negative number