728x90
1. 입력 (Input)
1.1. 입력스트림 (Input Stream)
1.1.1. scanf()의 문제점
C의 scanf의 문제는 입력에 대한 경계 검사를 하지 않는다는 문제가 있었다.
char input[4];
scanf("%s", input); // kyun
(1) 입력 전
(2) 입력 후
(3) 결론
주어진 메모리 공간보다 더 큰 데이터를 입력하는 경우, 입력에 대한 경계 검사를 하지 않는 오류로 인해 '버퍼 오버플로우' 현상이 발생한다.
1.1.2. 경계 검사 해결법
1.1.2.1. fgets
case 1) fgets 활용 시 Data Fail
// 해결책: fgets를 활용한 line 읽기
char input[4];
char line[8];
char temp[8]; // 입력 = kyunkyun\n\0
if (fgets(line, 8, stdin) != NULL) // line = kyunkyu\0
{
if (sscanf(line, "%s", temp) == 1 && strlen(temp) < 4) // temp = kyunkyu\0
{
strcpy(input, temp); // 진입 불가
}
}
case 2) fgets 활용 시 구문 오류
// 해결책: fgets를 활용한 line 읽기
char input[4];
char line[8];
char temp[8];
if (fgets(line, 8, stdin) != NULL) // line = kyun\n\0
{
if (sscanf(line, "%s", temp) == 1 && strlen(temp) <= 4) // temp = kyun\0
{
strcpy(input, temp); // input = kyun & input[5] = \0 <- 버퍼 오버플로우
}
}
case 3) fgets 활용을 통한 Data Load
// 해결책: fgets를 활용한 line 읽기
char input[4];
char line[8];
char temp[8];
if (fgets(line, 8, stdin) != NULL) // line = kyu\n\0
{
if (sscanf(line, "%s", temp) == 1 && strlen(temp) < 4) // temp = kyu\0
{
strcpy(input, temp); // input = kyu\0
}
}
1.1.2.2. cin & setw()
char input[4]
scanf("%s", input); // KYUN\0
3.
1.2. 스트림 상태 (Stream States)
1.3. 입력 버리기 (Discrading Input)
1.4. 입력 버리기 (get(), getline())