2012-09-26 19 views
7

Boş karakter veya sıfır sonlandırıcı (\0), bitişik bir karakter dizisini sonlandırmak için kullanılacaktır. Bunu C içinde buluyorum, karakteri bir dizgeye rastgele bir konuma ekleyebilirim ve bu noktadan dizgeyi keseceğim. Örneğin:Sıfır sonlandırıcı neden bir dizgede rastgele yerleştirilemiyor?

char * s = "Hello\0World"; 

dize "Hello" eşit olmak s sonuçlanacaktır. Ancak, JavaScript'de durum böyle değildir: Yukarıdaki gibi çalışmaz, beklendiği gibi çalışmayacaktır. s, "HelloWorld" dizesine eşit olacaktır.

Bu neden çalışmıyor?

+0

I Javascript'in C. olmadığını düşünün, böylece bir dizedeki boş bayt yalnızca bir dizgede boş bir bayttır. –

+1

Çoğu dil, dizeleri tamsayı uzunluğuna (bu nedenle boş karaktere izin vererek) temsil eden Pascal geleneğini izler. C aslında bu anlamda garip olanıdır. – hugomg

cevap

8

JavaScript, NULL sonlandırılmış dizeleri kullanmazken C yapar.

Javascript dizeleri, bir NULL dizenin sonunu işaretlediğini varsaymaya çalışmak yerine karakterleri ve uzunlukları ayrı ayrı izleyerek depolanır.

+0

Ne * JS dizeleri için kullanır? – 0x499602D2

+0

Onları “' 'ile ayırır. – Nanne

2

Javascript'te, bir String içinde NULL bayt, bir dizgede yalnızca NULL bayttır. Eğer dize

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

kesmek istiyorsanız ancak bu durumda ben C dize hala hafızasında bir adrese nerede "Merhaba \ 0World" işaret :)

4

boş bayt rahatsız gerekmez düşünüyorum saklanır, sadece çoğu dize taşıma işlevi dizenin 0 sonu dikkate alır. Bazı işlevler için bir string uzunluk argümanını geçmelisiniz, ancak en önemlisi boş baytı bulana kadar okunur. Bellekte dize aslında "Hello \ 0World \ 0" dır.

Bir JavaScript motoru, boş bir bayt aratarak dize uzunluğunu belirleyemez, çünkü böyle bir durumda bir dizenin içinde boş bir satır bulunamaz. Bu özelliklerde muhtemelen bir şey var. Motor bunun yerine dizginin uzunluğunu ayrı ayrı depolamalıdır ve daha sonra dizgeye eriştiğinizde o kadar çok karakteri bellekten okumalıdır.

Ve arabelleklerin boyutunu düzgün bir şekilde ayrıştırıp depolamak, genellikle kullanıcılardan gizlemeye çalışan betik dilleridir. Bu, komut dosyasının amacının yarısıdır, programcının, oluşturulmuş karakter arabelleklerine 0 eklenmesini veya dizge uzunluğunu ayrı ayrı saklamak için endişelenmesini gerektirmeyecek şekilde, dizge işleme işlevleri, boş dizininiz dışında bir grup rasgele karakter basmaz.

Tam olarak bir JavaScript dizesi nasıl davranır? Bilmiyorum, muhtemelen özelliklerini ayrıntılı olarak tanımlamak için motora kalmış. Belirtim gibi bir nesne ile aradığınız sürece, arabellek ve uzunluk için yapıları kullanarak, 0 için bir çeviri karakteri kullanarak, bağlantılı bir karakter listesi, vb. Kullanarak, herhangi bir şekilde uygulanabilir ...

İlgili konular