C언어에서 \n 과 \r 의 차이는 무엇인가요

suh1978의 이미지

C언어에서 \n 과 \r 의 차이는 무엇인가요

C++에서는 \n와 endl이 있던데 이것또한 정확한 차이를 못느끼겠습니다.

   printf("1test1\n");
   printf("2test2\r");
   printf("3test3\n\r");

위와 같이 테스트했더니만은
1test1
3test3

만 나오고 2test2는 어디로 사라져버리네요!...

purewell의 이미지

\r은 캐럿이 그 줄 맨 앞으로 갑니다.
(Carriage return)

\n은 캐럿이 다음 줄로 갑니다.
(Line feed)

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

익명 사용자의 이미지

컴터가 이상한지
\n 이 안 먹히고 이상한 글짜가 찍히는거 같아서
어 내가 잘못 알고 있나 싶어서 검색하다가 여기 왔습니다. ㅎ

사진 귀엽게 잘 찍으셨네여. << 이 말 하려고 답글 달아 봅니다. ㅋㅋ

ㅇㅇㅇㅇㅇ의 이미지

그리곤 3년 반이 조금 넘은 지금도 아무 대답이 없었다고 한다

기를의 이미지

죽이고 그래여!

???(혼란의 이미지

죽여여????

purewell의 이미지

...꺄! 살인이야!

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

13년 만에 두둥등장!의 이미지

...

13년 만에 두둥등장!의 이미지

그와중에 프사 그대로인거 실화냐?

오우대박의 이미지

대박이넹

ㅋㅋ의 이미지

ㅋㅋ

익명 사용자의 이미지

purewell wrote:
\r은 캐럿이 그 줄 맨 앞으로 갑니다.
(Carriage return)

\n은 캐럿이 다음 줄로 갑니다.
(Line feed)


각각의 원뜻은 그렇지만, c의 태생이 유닉스이기 때문에
\n은 다음 줄 맨 처음으로 가는 역할을 합니다.

\r(맨 앞)\n(다음줄)

혹, 예전에 리눅스에서 lpr로 텍스트 출력해보신 일이 있으시다면,
그당시는 lpr의 필터링이 text를 제대로 출력하지 못하는 현상을
아실겁니다.

유닉스의 텍스트에는 \n밖에 없고, 프린터는 \n을 \r\n으로 인식하지
못해서, 프린터로 출력되는 텍스트 출력물의 각 줄은 계단처럼
어긋나게 나오는 것 말입니다.
(이것은 아마도 제가 쓰던 HP 레이져 프린터가 DOS의 ascii문자를
프린터의 제어문자 CR,LF로 1대1로 되도록 한 HP프린터 드라이버의 문제일 가능성이 더 크지만..)

다들 아시겠지만, \r\n은 도스(윈도우즈)/ \n은 유닉스, \r은 Mac에서 CR+LF 구실을 합니다.

익명 사용자의 이미지

Anonymous wrote:

각각의 원뜻은 그렇지만, c의 태생이 유닉스이기 때문에

제어문자는 C와 무관한 표준인데....
사실 표준이라 할 것도 없지만...

ixevexi의 이미지

suh1978 wrote:
C언어에서 \n 과 \r 의 차이는 무엇인가요

C++에서는 \n와 endl이 있던데 이것또한 정확한 차이를 못느끼겠습니다.

   printf("1test1\n");
   printf("2test2\r");
   printf("3test3\n\r");

위와 같이 테스트했더니만은
1test1
3test3

만 나오고 2test2는 어디로 사라져버리네요!...

C++에서 endl은 함수로써 manipulator라고 합니다.

C++, 그리고 C++....
죽어도 C++

lifthrasiir의 이미지

suh1978 wrote:
C언어에서 \n 과 \r 의 차이는 무엇인가요

C++에서는 \n와 endl이 있던데 이것또한 정확한 차이를 못느끼겠습니다.

endl은 \n를 출력하면서 버퍼를 방출(flush)합니다.

- 토끼군

cinsk의 이미지

C 언어에서 각 escape sequence의 뜻은 다음과 같습니다:
- '\n' (newline) 다음 줄 맨 처음으로 감.
- '\r' (carriage return) 현재 줄 처음으로 감.
그리고 대부분 *nix 시스템에서 newline을 '\n'로서 파일 시스템에 기록하고 해석합니다. (따라서 C 언어의 정의와 충돌나지 않습니다.)

DOS, Windows 시스템에서 newline은 두개의 제어 문자인 '\r\n'으로 파일 시스템에 기록하고 해석합니다. 따라서 C 언어의 정의와 충돌합니다. 그래서 이런 파일들을 적절히 해석하기 위해서 fopen(3)의 두번째 인자로 'b'를 쓰지 않았다면, C 라이브러리 수준에서 파일 시스템의 '\r\n'의 두 문자를, 프로그램에서 '\n'으로 인식할 수 있게 해 줍니다. 그러나 이 경우, 두개의 제어 문자를 하나의 문자로 인식하기 때문에, 파일 크기를 다루는 등의 상황에서 문제를 일으킬 수 있습니다. 이럴 때 fopen(3)의 두번째 인자에 'b'를 추가하면, 이러한 번역 과정을 거치지 않고 직접 '\r\n'을 다룰 수 있습니다.

ASCII 코드를 채택하는 대부분의 시스템의 터미널에서 'RETURN', 'ENTER' 등의 키를 누르면 '\r'이 발생하며, 이 것은 device driver를 통해서 운영 체제가 적절하게 해석합니다. (대부분 newline으로 해석)

Mac과 EBCDIC, unicode는 다른 분들이 다뤄주세요. :wink:

suh1978의 이미지

제가 예를들었던 코드로 보면

printf("1test1\n"); => 출력하고 다음줄로
printf("2test2\r"); => 출력하고 현재줄 처음으로
printf("3test3\n\r"); => 출력하고 다음줄 처음으로..

그래서 2번째줄이 출력되었던 부분이 없어지고
3번째줄의 것이 출력되는게 맞나요..

생각했던것보다 간단하지 않은건지
확실하게 이해가 잘 안되서요..

열정은 남자의 미래다! - suki1978 style, free style

wfellow의 이미지

지금 부터는 CR, LF라고 지칭을 하도록 하겠습니다.

Quote:
C언어에서 \n 과 \r 의 차이는 무엇인가요?

아주 오랜 옛날, 그러니까 UNIX고 나발이고 없던 시절에 출력장치가 몇가지 없던 시절의 이야기입니다. 지금이야 CRT나 레이저 프린터 등등의 장비들이 있지만 예전에는 그런건 꿈도 못 꾸었었지요. 당시 출력장치로 프린터가 유일했을 시절에 IBM(International Business Machine)에서 그걸 만들었습니다.(아님 말구,..). 그때 프린터의 모델로는 일반 사무실에서 쓰는 qwerty 타자기를 모델로 하여 만들었는데 타자기의 동작을 분석하여 프린터의 명령으로 해석을 하게 했던것이었지요. CR(Carriage Return)은 타자수(?)가 한줄을 다 타이핑했을 경우 위의 레버를 잡고 왼쪽으로 힘있게 밀면 종이의 왼쪽 끝으로 포인트가 이동되고, 왼쪽끝에 다다르면 톱니에 의해 위로 한칸 밀려 올라가는 것을 하나의 명령으로 결정하여 LF(Line Feed)로 했습니다. 그 시절이후 일반 도트 프린터의 초기 모델까지도 이 두개의 명령체계가 맞아들어갔는데, 이후의 급격한 소프트웨어 및 하드웨어의 발달과 함께, 두개의 명령을 사용하여 하나의 동작(?)을 표현하는 것은 낭비라는 생각이 들게 된겁니다. 이후 각 OS마다 그 동작에 대한 나름대로의 방식을 만들어 낸것 뿐이고요. 다만 *NIX계열에서는 그 표현을 \n 하나로 지정하면서 제어문자로 추가하였고, \r은 제어문자로만 편입을 시켰던 겁니다. 소설(?)실력이 별로 없어서리 이해를 하실지 몰겠습니다.

자,.. 이제 아랫분이 DOS에서의 CR,LF 두개를 묶어서 줄바꿈 표현으로 정의 하게된 history를 썰을 풀어 주셔염^^.

-----[꼬릿말 절취선 시작]-----
삽질전에 먼저 구글신께 기도하자.
-----[꼬릿말 절취선 끝]-----

전웅의 이미지

기본적으로 C 언어에서 사용하는 \n, \r, \f 등을 실제 사용하고 있는
character codeset 의 특정 문자와 연관지어 생각하는 것은 문제를 다소
복잡하게 만들 수 있습니다.

C 언어는 \n, \r, \f 의 *외부 표현*이 어떻게 구성되는지와 무관하게 매우
추상적으로 그 행동을 기술하고 있습니다 - 이미 다른 분들께서 언급해
주셨듯이, \n 은 "다음 줄의 초기 위치로 이동" 으로 기술되어 있습니다.
다만, 그 행동 조차도 "요구"가 아닌 "의도"이기 때문에 특정 환경에서
기술된 행동을 보이지 않아도 표준을 위반했다고 보기 어렵습니다 - 예를
들어, \v 를 생각해 보시기 바랍니다.

OP의 질문에 답하자면,

printf("1test1\n"); // 출력하고 다음줄의 초기 위치로
printf("2test2\r"); // 출력하고 현재줄의 초기 위치로 
printf("3test3\n\r"); // 출력하고 다음줄의 초기 위치로, 그리고 다시 해당 줄의 초기 위치로

가 됩니다. 절대로(!) \n, \r 등을 특정 character set 의 문자나 문자
조합으로 가정해서는 안 됩니다. \n 의 외부 표현이 무엇이든 파일 모드만
올바르게 설정한다면 text 파일의 개행문자는 항상 \n 로 인식됩니다.
물론, text 파일을 binary mode 로 열어 다루고자 하거나, 다른 환경에서
생성된 text 파일을 다루고자 할 때에는 그와 같은 외부 표현 문제를 만날
수밖에 없습니다.

그리고 실제 C 언어에서 \n 로 대표되는 "개행문자(newline)"의 의미 역시
상당히 혼란스러운 역사를 갖습니다. 시간이 많지 않아 제 책 개정판에
들어갈 내용을 간단히 인용합니다. (책 내용을 긁어 온 탓에 경어를
사용하지 않습니다. 양해 바랍니다.)

Quote:
개행문자의 경우, 그 의미에 대해 많은 애매함이 존재한다. 과거
ASCII(ANSI X3.4)의 경우, 원래 "(수평 위치는 유지한 상태로) 다음 줄로
이동"을 의미하는 코드값 10의 문자(LF)를 "다음 줄의 초기 위치로 이동"
으로 정의하는 것을 허용했고, 실제 다수의 터미널(terminal)에서 그
문자는 원래의 기능을 수행했으나 유닉스에서는 후자의 기능을 수행했다.
또한, 문자와 관련된 표준화 위원회인 ISO/IEC JTC1/SC2/WG1은 이를 "다음
줄로 이동"을 의미하는 것으로 사용하고 있고, 더구나 ISO 646는 "다음
줄로 이동"과 "그 줄의 초기 위치로 이동"이라는 두 행동을 하나의 문자로
사용하는 것을 거의 금지하고 있지만, C 표준은 오랜 시간 동안 C
프로그래머들이 의존했던 관례를 존중해 개행문자 하나를 "다음 줄의 초기
위치로 이동"을 의미하는 것으로 정의하고 있다. 이런 까닭에 어떤
구현체(유닉스)는 C 언어의 개행문자를 만족하는 단일바이트 문자를 가지고
있는 반면, 다른 구현체(MS Windows)는 두 개의 문자("다음 줄로 이동"
ASCII의 LF에 해당, "그 줄의 초기 위치로 이동" ASCII의 CR에 해당)를
사용해 개행문자의 행동을 얻어야 한다.

또한, *nix, DOS/Windows 이외에 다른 환경의 예는 아래와 같습니다.

Quote:
Mac OS X 이전에는 CR이, Max OS X부터는 LF가, Cygwin의 경우 설치 옵션에
따라 CR+LF 혹은 LF가, CP/M의 경우엔 CR+LF가 C 언어의 개행문자 역할을
담당한다. OS/390이나 AIX의 경우 EBCDIC의 NEL(NExt Line) 문자가
개행문자의 역할을 한고, VMS의 경우 파일의 종류에 따라 고정길이
레코드를 포함해 개행문자의 외부 표현이 다양하게 바뀐다.

그리고, 표준 C 언어에서도 스트림이 line-buffering 되고 있다면
개행문자의 출력으로 출력 버퍼가 비워집니다. (뭐, 이 역시 "요구"가 아닌
"의도"일 뿐입니다만, C++ 표준 역시 "요구"는 못합니다.)

그럼...

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

addnull의 이미지

음.. 잘 이해가 안가는군요..
다시한번 찬찬히 읽어봐야할 듯.

다만, vim에서 각 line 끝마다 특정 문자열을 추가하고 싶을때는

1,$s/\n/추가문자열\r/g

이렇게 해야하더군요.

1,$s/\n/추가문자열\n/g

일거라 생각했는데..

2005년 11월 28일.

Prentice의 이미지

마지막 줄에는 안먹히네요.

그냥 :%s/$/추가문자열/ 하시면 될텐데요..

addnull의 이미지

검은해 wrote:
마지막 줄에는 안먹히네요.
그냥 :%s/$/추가문자열/ 하시면 될텐데요..

아.. 이런 방법도 있었네요 ^o^

음.. 그리고 제 방법으로 해보면 vim에서
개행문자를 검색할때는 "\n"으로 찾고
추가할때는 "\r"으로 추가하는 듯 해서 이상합니다?

2005년 11월 29일.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.