Line Separator 줄 구분자의 중요성 (LF, CR, CRLF) 그리고 scanf
- Seona Robin
- 2024년 6월 5일
- 2분 분량
by Kain, Kaite: 2024-06-05
summary: LF, CR, CRLF which distinguish new lines (3 styles) and gcc scanf error troubleshooting

Line Separator, 줄 구분자.
{'\n', '\r', "\r\n"}
생각보다 중요했던 개념이기에 정리합니다.

'\n' 우리가 모르고 썼던 줄 구분자입니다.
코딩에 입문할 때 뭣 모르고 우선 특수문자입니다 하고 배웠던 이 문자가 줄 구분자인 것이죠.
'\n' == '역슬래시 n'은 코드에서 우리가 키보드를 통해 Enter Key(엔터 키)를
누른 것과 같은 효과를 낳습니다.
이 방식을 LF이라고 합니다.
대부분의 IDE는 LF 방식으로 default가 잡혀 있죠.

자, 전에 보여드렸던 vs code에도 LF라고 설정되어 있습니다.
이 방식은 리눅스와 UNIX 계열의 OS에서 쓰는 것으로 커서 == 현재 위치를 한 줄 아래로
이동시켜줍니다.

(왼쪽: before) (오른쪽: after)
커서가 계속 맨 끝에 있죠?
\r
그래서 나온 다른 방식이 '\r'.
CR 방식입니다.
'\r' 도 line separator입니다.
이 친구는 '\n'과 달리 커서를 맨 앞(left)으로 옮겨주죠.

이렇게 됩니다.
(Classic MacOS 운영체제(OS)에서 쓰는 방식)
…하지만 이건 우리가 바라는 결과가 아니잖아요?
그래서 두 개를 결합합니다.

먼저 CR, 커서를 앞으로 당기고
다음으로 LF, 커서를 한 줄 아래로 이동시킵니다. (on Windows)
(들여쓰기는 에디터상 일어나는 것이라 일어나지 않습니다.
실제로 컴파일러는 들여쓰기를 무시하므로 없어도 괜찮습니다.)
이것이 바로 CRLF 방식.
LF 방식으로 설정되어 있었을 때 컴파일이 안 되는 오류를 고칠 수 있는 설정 방식입니다.
주로 네트워크 코드가 CRLF 방식으로 줄을 바꾸어 소켓에 문자열을 전달하는데요.
저도 위와 같은 방식으로 전달하는 것을 직접 확인했습니다.

gcc를 쓰다보면 꽤 많은 에러를 접하게 됩니다.
그 중 하나는 scanf 에러인데요.
scanf() 함수는 공백 문자(띄어쓰기) 혹은 '\n'을 기준으로 매개인자 값을 구분합니다.
그런데 특정 에디터에서 scanf로 두 개 이상의 매개인자를 사용자로부터 입력 받으려다
한 개는 잘 받는데 두 번째부터 값이 들어오지 않는 에러가 발생할 때가 있습니다.

에디터 설정을 바꾸어 주세요.
CRLF으로 바꾸면

적용되어 정상적으로 값을 받습니다.
cmd/terminal 에서 문제가 발생하면 알려주세요.

CRLF 방식은 줄 구분자 '\r', '\n'을 두 개 쓰기 때문에 2 Byte의 데이터를 먹습니다.
그렇기 때문에 줄만 한 줄 아래로 이동시키는 LF (only '\n') 방식이 선호될 때도 있죠.
그러나 특정 모듈이 CRLF 방식으로 설정되어 있지 않으면 문자열 명령어를 인식할 수 없어서
오류에 빠지기도 합니다.
이처럼 가장 기초적인 줄 처리 방식도
모르고 볼 때랑 알고 나서 볼 때가 많이 다른데요.
사용자 입장에서는 개의치 않는 것이 개발자 입장에서는 생각할 거리가 되는 게 신기합니다.
여러분은 어떤 방식이 좋아 보이시나요?
선호하는 방식에 따라 OS, Editor, Language, module을 결정하는 등
다양한 사고 방식이 있을 것 같습니다:)
Comments