위의 조건으로 else 블록을 실행할 입력 번호는 무엇입니까?
는 대부분의 경우 시스템은
else
블록을 실행할 수있는 입력이 없을 최대치 4294967295
그렇다면 32 비트 부호 INT를 이용한다.
많은 사람들이 언급했듯이 간단한 해결책은 가능한 경우 더 많은 비트가있는 변수를 사용하는 것입니다. 그러나 @Brendan이 지적한 바와 같이 그것은 단지 당신에게 다른 문제를줍니다.
#include <stdio.h>
#include <limits.h>
// Returns 1 if the string can by converted to unsigned int without overflow
// else return 0
int string2unsigned(const char* s, unsigned int* u)
{
unsigned int t = 0;
if (*s > '9' || *s < '0') return 0; // Check for unexpected char
while(*s)
{
if (*s == '\n') break; // Stop if '\n' is found
if (*s > '9' || *s < '0') return 0; // Check for unexpected char
if (t > UINT_MAX/10) return 0; // Check for overflow
t = 10 * t;
if (t > UINT_MAX - (*s - '0')) return 0; // Check for overflow
t = t + (*s - '0');
s++;
}
*u = t;
return 1;
}
int main(void) {
unsigned int u;
char s[100];
if (!fgets(s, 100, stdin)) // Use fgets to read a line
{
printf("Failed to read input\n");
}
else
{
if (string2unsigned(s, &u))
{
printf("OK %u\n", u);
}
else
{
printf("Illegal %s", s);
}
}
return 0;
}
예 :
input: 4294967295
output: OK 4294967295
input: 4294967296
output: Illegal 4294967296
보다 강력한 솔루션 대신에 이런 일이 될 수 scanf
이러한 기능을 사용하는 입력을 구문 분석하는 자신의 함수를 작성하는 것입니다
(내 원본 코드에 대한 더 나은 대안을 제시 한 @chux에 감사)
32 비트 정수를 사용하면 조건은 항상 true입니다. 그리고 그게 다야. – Lundin
앞서 언급했듯이 64 비트 정수가 필요할 것입니다. 이러한 아키텍처는 사용중인 아키텍처에 따라 달라질 수 있습니다. 어떤 아키텍처를 사용하고 있습니까? 또는 적어도 sizeof (long)와 sizeof (long long) gcc가 어떤 것인지 알려주십시오. 만약''4 ''라면 운이 나옵니다 (또는 적어도 문제는 훨씬 더 어려워지고 있습니다). 만약 그들 중 하나가 '4'보다 크다면 당신은'서명되지 않은 '대신 그것을 사용할 수 있습니다. – skyking
unsigned int 대신 long long 변수를 사용하십시오. 'scanf '에 대한 포맷은 "% ld"또는 "%"가 될 것입니다. PRId64 – LPs