2013-06-28 3 views
4

저는 지난 몇일 동안 제 1 학년을 CS 전공으로 준비하기 위해 C++을 가르쳐 왔습니다. 지금 C 스타일의 문자열을 사용하고 있으며 null 종결 자의 요점을 궁금해합니다.null 종결자가 필요한 이유는 무엇입니까?

나는 그것이 필요하다는 것을 이해하지만 나는 단지 문자열이 마지막 문자로 끝나지 않는 이유를 근본적으로 이해하지 못한다고 생각한다.

+3

마지막 문자가 무엇인지 어떻게 알 수 있습니까? – SLaks

+1

마지막으로 합의한 char가 필요합니다. C에서는 0 바이트입니다. ASM에서는 대개 $ char입니다. 마지막 숯을 알지만 컴파일러가 어떻게 생각하고 있는지 알 수 있습니까? –

답변

17

문자열이 마지막 문자로 끝나지 않는 이유를 근본적으로 이해하지 못합니다.

"마지막 문자"여기서 알 수있는 몇 가지 방법이 있습니다 :

  1. 스토어의 마지막을 나타내는 문자열의 문자를 별도로 문자열의 문자 수, 넣어
  2. 마커 문자 또는
  3. 문자열의 문자와 별도로 문자열의 마지막 문자에 대한 포인터를 저장합니다.

C 두 번째 경로를 선택하십시오. 다른 언어 (파스칼 등)가 첫 번째 경로를 선택합니다. C++ std::string의 일부 구현은 세 번째 경로 *을 선택합니다.


* std::string 심지어 첫 번째 또는 세 번째 방법을 사용하는 구현은 라이브러리의 C 부분과의 호환성을 위해 버퍼를 널 종료합니다. c_str()이 유효한 C 문자열을 반환하는 데 필요합니다.

+1

4. 모든 문자열을 고정 크기 배열로 만들고 가능하면 공백으로 채 웁니다. 그러나이 광기는 포트란에서만 견뎌야합니다. – cmaster

+0

나는 C++'string'이 일반적으로 효율성상의 이유로 첫 번째 솔루션 (또는 세 번째)을 사용하여 필요할 때마다 문자열 길이를 다시 계산할 필요가 없다고 언급해야한다고 생각합니다. C++과 호환되는 문자열을 유지하는 두 번째 해결책 ('string'은 null 문자를 포함하지 않는다고 가정합니다. 이것은 C++'string'에서는 합법적이지만'string :: size()'와 비교하여'strlen'을 줄입니다). - 최소한 string :: c_str()을 호출 할 때 (대부분의 구현체는 문자열의 크기가 변할 때 null 터미네이터를 한 번만 쓰지만). – syam

+0

@syam 대단한 의견입니다. 답변을 편집했습니다. 감사! – dasblinkenlight

0

c 스타일 문자열은 어떤 문자가 마지막 문자인지 모르기 때문에.

char buf[256] // this allows c-style strings that contain 255 characters 

을하지만 당신은 당신이하지 않을 수 버퍼 (가능성하지 않습니다) 채울 갈 때의 모든 공간을 사용 : 당신의 이름을 읽고 있다면 예를 들어, 당신은 버퍼과 같이 할 수 있습니다. "Jack"으로 채우는 경우 모든 정보가 아니라 처음 다섯 개의 인덱스 만 있습니다.

2

C 및 C++에서 c- 문자열은 문자 배열로 저장됩니다. 길이가 다른 문자열을 허용하기 위해 이러한 배열은 종종 포함 할 실제 문자열보다 훨씬 더 많이 할당됩니다. 예를 들어 프로그래머는 char[256] 배열을 할당 할 수 있습니다.이 배열은 0에서 255 사이의 길이를 가진 문자열을 포함 할 수 있습니다. 그러나 컴퓨터는 문자열이 실제로 얼마나 오래되었는지를 알 수 있어야하므로 null로 끝나야합니다 캐릭터. 그렇지 않으면 문자 배열의 길이가 문자열과 정확히 같아야합니다 (할당 및 복사 메모리가 많은 자원을 사용하므로 비실용적 인 해결책입니다).

0

문자열의 각 문자를 메모리의 메모리 블록으로 간주하십시오. 문자열이 메모리에있는 경우. 그 다음에는 다른 문자열이 인접하게 놓여지면 컴퓨터는 널 문자열이 없다면 2 번째 문자열이 1 번째로 결합 된 것으로 생각할 것입니다. 따라서 null은 구분 기호로 사용됩니다.