2012-09-26 9 views
7

El carácter nulo o terminador nulo (\0) se utiliza para terminar una secuencia contigua de caracteres. Encuentro que en C, puedo agregar el carácter en una secuencia en una posición aleatoria y la cuerda se cortará desde ese punto. Por ejemplo:¿Por qué el terminador nulo colocado arbitrariamente en una cadena no lo termina?

char * s = "Hello\0World"; 

dará lugar a s ser igual a la cadena "Hello". En JavaScript, sin embargo, este no es el caso:

var s = "Hello\0World"; 

Lo anterior no funcionará como se esperaba. s será igual a la cadena "HelloWorld".

¿Por qué no funciona?

+0

I piense que Javascript no es C. entonces el byte nulo en una cadena es simplemente un byte nulo en una cadena. –

+1

La mayoría de los lenguajes siguen la tradición de Pascal de representar cadenas como una matriz con una longitud entera (lo que permite el carácter nulo). C es realmente el extraño en este sentido. – hugomg

Respuesta

8

JavaScript no utiliza cadenas terminadas NULL, mientras que C lo hace.

Las cadenas de Javascript se almacenan haciendo un seguimiento de los caracteres y la longitud por separado en lugar de intentar suponer que un NULL marca el final de la cadena.

+0

¿Qué * usa * JS para cadenas? – 0x499602D2

+0

Los separa con '" '.... – Nanne

2

En Javascript un NULL byte en una cadena es simplemente un byte NULL en una cadena. Si quieren truncar la cadena

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

pero en este caso creo que no es necesario alterar el byte nulo :)

4

La cadena C sigue apuntando a una dirección de memoria donde "Hola \ 0World" se almacena, solo que la mayoría de las funciones de manejo de cadenas consideran 0 fin de cadena. Para algunas funciones, debe pasar un argumento de longitud de cadena, pero la mayoría simplemente lo lee hasta que encuentre el byte nulo. En la memoria, la cadena es en realidad "Hello \ 0World \ 0".

Un motor de JavaScript no puede determinar la longitud de la cadena buscando un byte nulo, ya que en ese caso nunca podría tener un nullbyte dentro de una cadena. Probablemente hay algo acerca de eso en las especificaciones. En su lugar, el motor debe almacenar la longitud de la cadena por separado, y luego leer tantos caracteres de la memoria cada vez que acceda a la cadena.

Y cómo analizar y almacenar correctamente el tamaño de los búferes es algo que los lenguajes de scripts generalmente intentan ocultar al usuario. Esa es la mitad del propósito del scripting, no requerir que el programador se preocupe por agregar 0 a los búferes de caracteres creados y/o almacenar la longitud de cadena por separado para que las funciones de manejo de cadenas no impriman un montón de caracteres aleatorios fuera de su búfer buscando un nullbyte.

Entonces, ¿exactamente cómo se comporta una cadena de JavaScript? No lo sé, probablemente le corresponda al motor describir sus propiedades en profundidad. Siempre que interactúe con el objeto como dice la especificación, puede implementarse de cualquier manera, utilizando estructuras para el búfer y la longitud, usando un carácter de traducción para 0, usando una lista de caracteres vinculada, etc. ...

Cuestiones relacionadas