저는 지난 몇일 동안 제 1 학년을 CS 전공으로 준비하기 위해 C++을 가르쳐 왔습니다. 지금 C 스타일의 문자열을 사용하고 있으며 null 종결 자의 요점을 궁금해합니다.null 종결자가 필요한 이유는 무엇입니까?
나는 그것이 필요하다는 것을 이해하지만 나는 단지 문자열이 마지막 문자로 끝나지 않는 이유를 근본적으로 이해하지 못한다고 생각한다.
저는 지난 몇일 동안 제 1 학년을 CS 전공으로 준비하기 위해 C++을 가르쳐 왔습니다. 지금 C 스타일의 문자열을 사용하고 있으며 null 종결 자의 요점을 궁금해합니다.null 종결자가 필요한 이유는 무엇입니까?
나는 그것이 필요하다는 것을 이해하지만 나는 단지 문자열이 마지막 문자로 끝나지 않는 이유를 근본적으로 이해하지 못한다고 생각한다.
문자열이 마지막 문자로 끝나지 않는 이유를 근본적으로 이해하지 못합니다.
"마지막 문자"여기서 알 수있는 몇 가지 방법이 있습니다 :
C 두 번째 경로를 선택하십시오. 다른 언어 (파스칼 등)가 첫 번째 경로를 선택합니다. C++ std::string
의 일부 구현은 세 번째 경로 *을 선택합니다.
std::string
심지어 첫 번째 또는 세 번째 방법을 사용하는 구현은 라이브러리의 C 부분과의 호환성을 위해 버퍼를 널 종료합니다.
c_str()
이 유효한 C 문자열을 반환하는 데 필요합니다.
4. 모든 문자열을 고정 크기 배열로 만들고 가능하면 공백으로 채 웁니다. 그러나이 광기는 포트란에서만 견뎌야합니다. – cmaster
나는 C++'string'이 일반적으로 효율성상의 이유로 첫 번째 솔루션 (또는 세 번째)을 사용하여 필요할 때마다 문자열 길이를 다시 계산할 필요가 없다고 언급해야한다고 생각합니다. C++과 호환되는 문자열을 유지하는 두 번째 해결책 ('string'은 null 문자를 포함하지 않는다고 가정합니다. 이것은 C++'string'에서는 합법적이지만'string :: size()'와 비교하여'strlen'을 줄입니다). - 최소한 string :: c_str()을 호출 할 때 (대부분의 구현체는 문자열의 크기가 변할 때 null 터미네이터를 한 번만 쓰지만). – syam
@syam 대단한 의견입니다. 답변을 편집했습니다. 감사! – dasblinkenlight
c 스타일 문자열은 어떤 문자가 마지막 문자인지 모르기 때문에.
char buf[256] // this allows c-style strings that contain 255 characters
을하지만 당신은 당신이하지 않을 수 버퍼 (가능성하지 않습니다) 채울 갈 때의 모든 공간을 사용 : 당신의 이름을 읽고 있다면 예를 들어, 당신은 버퍼과 같이 할 수 있습니다. "Jack"으로 채우는 경우 모든 정보가 아니라 처음 다섯 개의 인덱스 만 있습니다.
C 및 C++에서 c- 문자열은 문자 배열로 저장됩니다. 길이가 다른 문자열을 허용하기 위해 이러한 배열은 종종 포함 할 실제 문자열보다 훨씬 더 많이 할당됩니다. 예를 들어 프로그래머는 char[256]
배열을 할당 할 수 있습니다.이 배열은 0에서 255 사이의 길이를 가진 문자열을 포함 할 수 있습니다. 그러나 컴퓨터는 문자열이 실제로 얼마나 오래되었는지를 알 수 있어야하므로 null로 끝나야합니다 캐릭터. 그렇지 않으면 문자 배열의 길이가 문자열과 정확히 같아야합니다 (할당 및 복사 메모리가 많은 자원을 사용하므로 비실용적 인 해결책입니다).
문자열의 각 문자를 메모리의 메모리 블록으로 간주하십시오. 문자열이 메모리에있는 경우. 그 다음에는 다른 문자열이 인접하게 놓여지면 컴퓨터는 널 문자열이 없다면 2 번째 문자열이 1 번째로 결합 된 것으로 생각할 것입니다. 따라서 null은 구분 기호로 사용됩니다.
마지막 문자가 무엇인지 어떻게 알 수 있습니까? – SLaks
마지막으로 합의한 char가 필요합니다. C에서는 0 바이트입니다. ASM에서는 대개 $ char입니다. 마지막 숯을 알지만 컴파일러가 어떻게 생각하고 있는지 알 수 있습니까? –