이것은 일반적으로 논의 항목,전체의 의견을지만 흥미로운 정보를 요청하는 경우가 있습니다. 관찰하는 대다수 사람들의는 이미 대응하는 비슷한 질문에 이 사이트에서 가을의 측면에 fgets()
. 나는 그들 중 하나입니다. 내가 찾기 fgets()
훨씬 더 나은 사용하는 사용자 입력을 위해보 scanf()
몇 가지 예외가 있습니다. scanf()
가 많은 것으로 간주 등으로 최적의 처리하는 방법이 사용자 입력. 예를 들어
"...그것은 당신을 말할 것이다지 성공했지만,당신에게 말할 수 있만 약 곳에 실패했으며,모든 방법 또는 이유. 당신
에는 아주 조금 할 수 있는 기회를 어떠한 오류 복구."
(jamesdlin). 그러나의 관심에서 시도 균형을 것이다,시작을 인용하 는 이론.
사용자 입력에서 오 stdin
즉,키보드 입력, fgets()
더 나은 선택이 될 것입니다. 그것은 훨씬 더 관대하는 문자열을 읽을 수 있는 완벽히 검증 하기 전에 변환을 시도
중 하나에 몇 번의 양식을 사용하여 scanf(): fscanf() 괜찮을 것이 사용될 수 있습으로 변환할 때 입력에서 매우 통제된 소스에서 즉,독서 엄격하게 형식의 파일을 반복적으로 예측 가능한 필드가 있습니다.
더 많은 토론, 이 비교 의 하이라이트는 두 개의 추가적인 장점과 단점을 두었습니다.
편집:소 OP 추가적인 질문에 대한 오버플로우:
"하나 더 많은 것을 물어보고 싶은 경우에도 우리가 사용하는 fgets 무슨 일이 일어날 경우 사용자가 문자를 입력보다 더 경계선(내가 많은 것을 의미의
캐릭터),그것으로 이어질 buffer overflow? 한 다음을 처리하는 방법
니까?"
[fgets()](https://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm 은 멋지게를 방지하기 위해 설계되었 buffer overflow,을 사용하여 간단하게 그것의 매개 변수를 제대로,예를 들어:
char buffer[100] = {0};
...
while fgets(buffer, sizeof buffer, stdin);
이 방지 입력 보다 큰 버퍼 크기에서 처리되고 있고,따라서을 방지하는 오버플로우가 발생합니다.
도를 사용하여 scanf()
을 방지 버퍼 오버플로우 타임 아웃 기능을 사용하여 폭을 지정자 로서 형식 문자열입니다. 를 읽어들이는 경우에 입력 예를 들어 및 제한을 입력 크기에서 사용하는 최대 100 자 코드는 다음이 포함됩니다.
char buffer[101] = {0};// includes space for 100 + 1 for NULL termination
scanf("%100s", buffer);
^^^ width specifier
그러나 숫자,오버플로우가 너무 좋지 않을 사용하여 scanf()
. 을 보여주고,사용이 간단한 코드를 입력 두 값에 표시된 코멘트 하나씩 실행:
int main(void)
{
int val = 0;
// test with 2147483647 & 2147483648
scanf("%d", &val);
printf("%d\n", val);
return 0;
}
두 번째로 가치,내 시스템에서 발생 다음과 같다:
NON-FATAL RUN-TIME ERROR: "test.c", line 11, col 5, thread id 22832: Function scanf: (errno == 34 [0x22]). Range error
`
여기에서 읽을 필요가 문자열을,그 다음에는 문자열을 수 변환 중 하나를 사용하여 strto_()
기능: strtol(), strtod(),...). 모두 할 수있는 기능을 포함한 테스트를 위한 오버플로 전에 일으키는 실행 시간이 경고 또는 오류가 있습니다. 를 사용하여 사항에 유의하십시오 atoi()
, atod()
을 보호하지 않습니다에서 오버플로나.