source

오래된 Mac OS의 C 컴파일러에서 \n의 값은 얼마입니까?

factcode 2022. 11. 5. 08:55
반응형

오래된 Mac OS의 C 컴파일러에서 \n의 값은 얼마입니까?

배경:

Mac OS 버전 9 이전 버전에서는 텍스트 파일의 표준 표현이 ASCII CR(캐리지 리턴) 문자(값 10진수 13)를 사용하여 줄의 끝을 표시했습니다.

Mac OS 10은 이전 릴리스와 달리 UNIX와 유사하며 ASCII LF(라인 피드) 문자(값 10진수 10)를 사용하여 행의 끝을 표시합니다.

, 즉 상수의 됩니까'\n' ★★★★★★★★★★★★★★★★★」'\r'의 C++ 컴파일러를 X보다 할 수 있습니까?

취할 수 있는 접근법에는 적어도 두 가지가 있습니다.

  1. '\n'및 시 orASCII LF 문자로 변환하고 텍스트 스트림에서 출력 및 입력 시 CR로 변환합니다(Windows 시스템에서 LF와 CR-LF 간의 변환과 유사).
  2. '\n'ASCII CR ascii ascii ascii ascii 。을 사용하다

두 번째 접근법에는 몇 가지 잠재적인 문제가 있을 수 있습니다. 중 하나가 바로 그 를 가정한 것입니다.'\n'LF )))) ))))) 이러한 코드는 (본격적으로)는 '', '보다', '보다', '보다', '보다'에 대한 명확한 값이 한다는 입니다.'\r'ASCII CR.를 허용하지 .'\n' == '\r'(인용문헌을 찾아준 mafso 덕분에, 5.2.2 단락 3) 따라서 다른 값을 사용해야 합니다.'\r'.

Mac OS N에서 컴파일 및 실행되었을 때 N이 10 미만일 때 이 C 프로그램의 출력은 얼마입니까?

#include <stdio.h>
int main(void) {
    printf("'\\n' = %d\n", '\n');
    printf("'\\r' = %d\n", '\r');
    if ('\n' == '\r') {
        printf("Hmm, this could be a problem\n");
    }
}

이 질문은 C와 C++ 모두에 적용됩니다.둘 다 정답이 같을 것 같아요.

답은 C 컴파일러마다 다를 수 있지만 컴파일러 구현자가 서로 일관성을 유지했으면 합니다.

확실히 하기 위해 이전 Mac OS 릴리스가 텍스트 파일에서 엔드 오브 라인(end-of-line)을 나타내기 위해 어떤 표현을 사용했는지 묻는 것이 아닙니다.제 질문은 상수의 값에 관한 것입니다.'\n' ★★★★★★★★★★★★★★★★★」'\r'C++는 C++로 하다.알고 있다.'\n'(값이 무엇이든) 텍스트스트림으로 변환하면 시스템의 엔드 오브 라인 표현(이 경우는 ASCII CR)으로 변환됩니다.준작 c c c c c다다다 。

상수 값\r ★★★★★★★★★★★★★★★★★」\n곳과 되었습니다.클래식 Mac OS 환경에서도 였습니다.\r 13CRcr ASCII 13)이었다.0x0d);\n 10LF† ASCII 10)입니다.0x0a은 Classic Mac OS \r편집기에서 되었습니다.\n시스템 UNIX 시스템에서 됩니다.\r\nDOS windows Windows の dos dos dos dos dos dos dos dos 。

다음은 Mac OS 9의 Metrowerks CodeWarrior에서 실행되는 간단한 테스트 프로그램의 스크린샷입니다. 예를 들어 다음과 같습니다.

CodeWarrior에서 실행 중인 프로그램 예시

Classic Mac OS의 C.음음음 functions 등의 printf()코드 워리어용 SIOUX.이 라이브러리는 텍스트 필드가 있는 창에 출력을 작성하여 C 표준 I/O를 구현했습니다.와 같이, 파일O 의 실장에서는, 「I/O」가 「I/O」의 사이에 자동 하고 있는 .\r ★★★★★★★★★★★★★★★★★」\n은 (Windows의 경우)에 같은 ).\r\n"b"을 들다fopen()( ) ) ) 。Mac OS Toolbox 。

페이지를 검색한 결과, 특히 다음과 같은 내용이 있는 오래된 설명과 함께 이 페이지를 찾았습니다.

Metrowerks MacOS 구현은 한 걸음 더 나아가 파일을 포함하는 I/O에서 "\r" 및 "\n" 이스케이프에 대한 CR 및 LF의 중요성을 반전시킵니다.다른 컨텍스트에서는 그렇지 않습니다.즉, 텍스트 모드에서 FILE 또는 fstream을 열면 모든 '\r'이 LF로 출력되며 CR로 출력되는 모든 '\n'도 마찬가지입니다.즉, ASCII 바이너리로의 이스케이프 대응이 반대로 됩니다.단, 메모리에서는 sprintf()를 사용하여 버퍼로 전송하거나 std:: string stream으로 변환되지 않습니다.이것은 혼란스럽고, 비표준적인 것은 아니더라도 적어도 다른 구현보다 더 나쁘다고 생각합니다.

MSL에 대한 해결 방법이 있는 것으로 나타났습니다. 이진 모드에서 파일을 열면 '\n'은 항상 LF이고 '\r'은 항상 == CR입니다.이것이 제가 원하던 것입니다만, 이 정보를 입수하는 과정에서, 저는 이것이 제가 원하는 것을 얻기 위한 "표준적인" 방법이라는 많은 이유를 알게 되었습니다.이 방법은 구현에 있어서의 버그의 회피책에 가깝다고 느낄 때 말입니다.역시 CR와 LF는 7비트 ASCII 값이기 때문에 텍스트 모드로 파일을 열면 표준적인 방법으로 사용할 수 있을 것입니다.

(답변은 이것이 실제로 기준 위반이 아님을 명확히 한다.)

이 때문에, 적어도 1개의 실장에서는,\n ★★★★★★★★★★★★★★★★★」\rASCII 아스키

오래된 Mac 컴파일러에서는 \r과 \n의 역할이 반대입니다.'\n' == 13, '\r' == 10이었는데, 오늘날 '\n' == 10 및 '\r' == 13입니다.이행 국면에서는, 매우 즐겁습니다.오래된 컴파일러가 있는 파일에 "\n"을 쓰고 새 컴파일러가 있는 파일을 읽고 "\r"을 얻습니다(물론 두 번 모두 실제로 13을 가지고 있었습니다).

C 언어 사양:

5.2.2

실행 문자를 시퀀스는 다음과같이 으로 합니다.

\n(새 라인) 활성 위치를 다음 라인의 초기 위치로 이동합니다.
\r(캐리지 리턴) 활성 위치를 현재 라인의 초기 위치로 이동합니다.

\n에서는 ASC가 사용됩니다.II ii iiLF

컴파일러를 할 수 없지만, "Mac"의입니다.'\n'(컴파일러가 실행 인코딩으로 ASCII 호환 인코딩을 사용한 것을 감안하면) ASCII 새 행 문자와 같아야 합니다. '\r'ASCII를 사용하다

또는 는 OS의 합니다.'\n'OS가 회선을 종단하기 위해 사용하는 모든 것에 대응합니다.실행 시 이러한 문자의 숫자 값은 전적으로 실행 문자 집합에 의해 결정됩니다.

따라서 여전히 ASCII 호환 실행 인코딩이므로 숫자 값은 기존 Mac 컴파일러와 같아야 합니다.

언급URL : https://stackoverflow.com/questions/25065940/what-is-the-value-of-n-under-c-compilers-for-old-mac-os

반응형