해결된 질문
작성
·
245
0
코드를 실행해보면 위와 같다.
처음에 char타입 배열 words를 선언하고, 그 공간에 "hello world\n"를 입력하면
gets( )함수가 한번에 버퍼를 읽어들인 뒤 내부적으로 \n을 제거하고(받지않고) \0를 추가시켜서 "hello world\0"를 배열 words에 저장한다.
"START\n"가 출력되고
"hello world"가 출력되고
바로 이어서 "hello world"가 출력된 뒤 줄바꿈(\n)이 된다.
마지막으로 "END"가 출력된다.
1. 강의 6:00 부분입니다. 제가 위에 작성한 것처럼 내부적으로 처리되는 과정을 적어보았는데, 여기서 생긴 궁금한 부분이 "문자열을 입력했을 때에도 내부적으로 뒤에 \0를 붙여서 처리해주는가?"입니다.
보통 코드 상으로 어떤 char타입의 배열을 선언하고 거기에 문자열을 대입한다고 했을 때 자동적으로 내부적으로는 뒤에 \0이라는 null character가 붙습니다.
그런데 이것이 콘솔 창에서 입력해주었을 때도 마찬가지로, 내부적으로 입력한 문자배열+\0으로 처리해주는지 궁금합니다.
만약 그렇다면, gets( )함수가 words를 입력받고 \n가 입력되는 순간, "hello world\0+\0"으로 저장이 될 것입니다.
2. 콘솔창에 printf( )함수로든 puts( )함수로든 출력이 될 때, 문자열에 (내부적으로 저장되어있는) null character(\0)도 마찬가지로 입출력 버퍼에 저장되는 것은 동일한데
출력 시 콘솔 창에 표현이 안되고
단순히 hello worldhello world로 표시가 되는것인지 궁금합니다.
이것이 사실 콘솔창에 \0도 출력되는 것이지만, 공백이 아니라 말그대로 null character이기 때문에 표시되지 않는 것처럼 보이는 건가요?
답변 1
0
안녕하세요,
1.
gets() 문자열을 입력받는 경우 자동으로
null character가 붙습니다.
아래의 링크를 참고해보시기 바랍니다.
§ 7.19.7.7, The gets function
The gets function reads characters from the input stream pointed to by stdin, into the array pointed to by s, until end-of-file is encountered or a new-line character is read. Any new-line character is discarded, and a null character is written immediately after the last character read into the array.
그렇기에 "gets()함수가 words를 입력받고 \n가 입력되는 순간" 이라는 상황에서는 \0 + \n이 될 것입니다.
2.
콘솔창에 제어문자는 본래 표현되지 않습니다.
일례로 \n 을 들 수 있겠습니다.
이는 개행을 해줄 뿐, 어떤 눈에 보이는 출력의 대상이 아닙니다.
(말 그대로 제어를 위한 문자이지요)
마찬가지로 \0의 경우도 문자열의 끝을 표기하기 위한 수단일 뿐이기에
콘솔창에 \0라고 출력되지는 않는 것입니다.
백슬래시로 표현되는 것들이 제어문자이고, 이것은 '제어'로서의 기능만 할 뿐 출력의 대상이 아니라는 개념을 항상 인지하고 있어야겠습니다. 확실히 이해할 수 있었습니다. 감사합니다.