inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

홍정모의 따라하며 배우는 C언어

11.4 문자열을 입력받는 다양한 방법들

22:14 구간 예제 질문

249

조준수

작성한 질문수 33

0

예제의 내용이 엔터키와 입력값이 없는 경우가 아닌이상 

문자열을 계속 받는 코드잖아요.

그런데 입력값을 NULL, null, '\n', '\0'

요 4개를 입력해도 무한루프가 종료되네요.

어떠한 이유때문에 이런건지 알수 있을까요?

c

답변 1

5

안소

디버깅을 해보니 이런 현상 때문이네요!

NULL 을 입력하면 크기 5인 small_array 에  { 'N', 'U', 'L', 'L', '\0' } 이 들어갑니다. 즉, 입력 버퍼에서 차례로 꺼내서  small_array[0] 첫번째 원소부터 하나 하나씩 채워 주는 것입니다.

그런데 여기서 주의해야할 점은 fgets 는 개행문자까지도 입력 버퍼에서 꺼내와 입력을 받는 함수라는 것입니다. 따라서 원래라면  { 'N', 'U', 'L', 'L', '\n' } 이 되는 것이 맞겠지만, C언어에서 문자열을 표현할 땐 문자열 뒤에 꼭 \0 가 붙어야지만 문자열 끝이 어딘지 알 수 있기에, 배열크기가 n 이라면 딱 n - 1 크기까지만 입력을 받습니다. 즉, small_array[0] ~ small_array[3] 에만 입력한다는 것입니다. 끝에 나머지 하나인 small_array[4] 는 \0 이 되어야 하니까요! 그러니까 small_array 의 크기는 5지만 앞에 4개의 자리에만 입력을 받는다는 것입니다. 

따라서 { 'N', 'U', 'L', 'L', '\0' } 가 되며 \n 은 아직 입력 버퍼에 남아있는 상태입니다. 그것도 버퍼에서 가장 첫번째로 앞에 있는 상태이기에 다음 반복에서 첫번째로 빠져나오게 될 것입니다.

그리고 이제 다음 while 문 반복을 하게 되는데 fgets 는 자연스럽게 입력 버퍼에 남아있던 \n 을 가져와 small_array[0] 에 저장을 합니다. 즉,  { '\n', 'U', 'L', 'L', '\0' }  상태가 됩니다. 이는 while 문 종료 조건에 해당합니다. (small_array[0] == '\n' 이므로) 따라서 더 이상 while 문이 돌지 않고 종료되는 것입니다.

다른 예시도 다 같을 것이라고 생각됩니다. 그래서 질문자님께서 주신 예시 아니더라도 4 자리의 문자열을 입력하면 똑같은 현상이 발생하네요!!! (질문자님 예시도 전부 문자열 4자리구요)  small_array 의 크기가 5인 것과 관련이 있습니다. 즉, 결론적으로 \n 이 입력 버퍼 남아있는 것 중 가장 첫번째가 되는 케이스는 다음 반복에서 small_array[0] 에 입력되기에 종료되는 현상이 발생한다고 생각하시면 됩니다. 만약 이 코드를 실무적으로 쓰겠다고 한다면 이런 케이스가 발생하지 않도록 설정해주어야 할 것 같네요! 의도치 않은 결과니까요

Export template 안됨

1

62

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

88

3

main 함수에서 왜 int만 선언이 되는걸까요

1

78

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

74

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

77

1

프로토타입과 함수간의 인자 불일치

1

86

2

12.12 헤더 관련 질문

1

74

2

Visual Studio Community 2026 사용 문의

1

167

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

71

2

getchar(), putchar()

1

110

3

강의자리ㅛ

1

92

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

127

2

소스파일안에 여러 파일

1

87

2

F5와 F7의 차이

1

90

2

c = TWO * (a+b); 에서 a와 b는?

1

67

2

; 세미콜론을 붙이는 기준에 문의

1

78

1

Step over 기능 문의

1

64

2

2.6 강의 따옴표 출력 규칙 문의

1

87

2

int main 함수 관련 오류 문의

1

76

2

13.4 words[0]

0

73

2

11.7 함수를 구현해 봤습니다.

1

67

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

71

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

60

2

11.6 fit_str함수를 구현해 봤습니다.

1

58

2