2013-10-20 1 views
1

나는 >0 && <2^64의 유효성을 검사하기 위해 scanf("%llu%c", &myUnsignedLong, &checkerNewLine)을 사용하고 있습니다. 누군가을 삽입하려고하면 checkerNewLine이 버퍼를 지우는 데 사용됩니다.왜 scanf llu가 % llu의 유효성을 검사하지 않습니까?

그러나 음수를 삽입하려고 시도하면 -541231과 같이 scanf이 성공하고 2를 반환합니다 (일치하는 매개 변수의 개수로). 분명히 myUnsignedLong에 저장된 번호는 2^64-541231이지만 내 의도는 아닙니다.

간단한 방법으로 해결할 수 있습니까? 감사 명세서에서 많은

+0

그럼 의도는 무엇입니까? – haccks

+2

@ haccks 아마도 OP는'scanf ("% llu")'가 음수를 분석하지 못하고 오류를 반환 할 것이라고 예상했다. – pburka

답변

4

(7.9.16.2)

u 포맷 값으로 strtoul 함수의 대상 서열에 대한 기대와 동일 임의로 서명 진수 정수, 일치 10을 기본 인수로 사용합니다. 해당 인수는 부호없는 정수에 대한 포인터입니다.

입력 내용은 선택적으로 서명됩니다. 이것은 코드가 왜 동작하는지 설명합니다.

그러나 왜 이렇게 지정했는지에 대해서는 설명 할 수 없습니다. 서명되지 않은 변수에 음의 값을 잘 정의 된 방식으로 저장할 수 없기 때문에 실제로 정의되지 않은 동작이 호출 될 수 있습니다.

+0

아마도 UB가 호출됩니다. – haccks

+0

그래서 범위 내에서 어떤 값 으로든 유효성을 검사 할 수 없습니다. MIN rodi

관련 문제