2012-09-26 2 views
7

널 문자 또는 널 (null) 종료 문자 (\0)는 인접한 문자 시퀀스를 종료하는 데 사용됩니다. C에서 캐릭터를 임의의 위치에 추가 할 수 있으며 문자열은 그 위치에서 잘릴 수 있습니다. 예를 들어null-terminator가 문자열에 임의로 배치되어 종료되지 않는 이유는 무엇입니까?

char * s = "Hello\0World"; 

문자열 "Hello" 이상임 s 될 것이다. 그러나 JavaScript에서는 다음과 같은 경우가 아닙니다.

var s = "Hello\0World"; 

위의 내용은 예상대로 작동하지 않습니다. s"HelloWorld" 문자열과 같습니다.

왜 작동하지 않습니까?

+0

I Javascript가 C가 아니라고 생각하면 문자열의 null 바이트는 단순히 문자열의 null 바이트입니다. –

+1

대부분의 언어는 문자열을 정수 길이의 배열로 나타내는 파스칼 전통을 따르고 있습니다 (따라서 null 문자 허용). C는 실제로이 의미에서 이상한 것입니다. – hugomg

답변

8

JavaScript는 NULL 종료 문자열을 사용하지 않지만 C는 NULL 종료 문자열을 사용하지 않습니다.

자바 스크립트 문자열은 NULL이 문자열의 끝을 표시한다고 가정하지 않고 문자와 길이를 별도로 추적하여 저장됩니다.

+0

JS는 문자열에 무엇을 사용합니까? – 0x499602D2

+0

그것들을'''....로 구분합니다. – Nanne

2

자바 스크립트에서 NULL 문자열의 바이트는 단순히 문자열의 NULL 바이트입니다. 당신은 문자열

var s = "Hello\0World".split("\0").shift(); 

을 절단하려는 경우 그러나이 경우 나는 그것이 C 문자열이 여전히 메모리에 주소로 여기서 "안녕하세요 \ 0World"을 지적 :)

4

널 바이트를 방해 할 필요가 없습니다 생각 대부분의 문자열 처리 함수는 0 문자열 끝을 고려합니다. 일부 함수의 경우 문자열 길이 인수를 전달해야하지만 대부분 null 바이트를 찾을 때까지 읽는 것이 가장 간단합니다. 메모리에서 문자열은 실제로 "Hello \ 0World \ 0"입니다.

자바 스크립트 엔진은 null 바이트를 찾음으로써 문자열 길이를 결정할 수 없습니다. 이러한 경우에는 문자열 내부에 nullbyte를 가질 수 없기 때문입니다. 아마도 사양에 관한 것이있을 것입니다. 대신 엔진은 문자열의 길이를 별도로 저장 한 다음 문자열에 액세스 할 때마다 메모리에서 해당 문자를 읽어야합니다.

그리고 버퍼의 크기를 올바르게 구문 분석하고 저장하는 방법은 스크립팅 언어가 대개 사용자로부터 숨기려고합니다. 프로그래머가 작성한 문자 버퍼를 추가하거나 문자열 길이를 별도로 저장하는 것에 대해 걱정할 필요가 없기 때문에 문자열 처리 기능이 버퍼 외부에 nullbyte를 찾는 무작위 문자를 인쇄하지 않도록 스크립트의 목적의 절반 정도입니다.

정확히 어떻게 JavaScript 문자열이 어떻게 동작합니까? 나도 잘 모르겠다. 엔진의 특성을 깊이있게 설명하는 것은 엔진에 달려있다. 오히려 스펙과 같이 오브젝트와 인터페이스를하는 한, 버퍼 및 길이 구조체를 사용하고, 0의 변환 문자를 사용하고, 링크 된 문자 목록을 사용하여 구현할 수 있습니다.

관련 문제