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())

 

 

 

+ Recent posts