2012-09-26 40 views
7

Ký tự null hoặc null-terminator (\0) sẽ được sử dụng để chấm dứt chuỗi liên tiếp các ký tự. Tôi thấy rằng trong C, tôi có thể thêm nhân vật vào một chuỗi tại một vị trí ngẫu nhiên và chuỗi sẽ bị cắt khỏi điểm đó. Ví dụ:Tại sao không có null-terminator được đặt tùy ý trong một chuỗi chấm dứt nó?

char * s = "Hello\0World"; 

sẽ cho kết quả là bằng với chuỗi "Hello". Trong JavaScript, tuy nhiên, đây không phải là trường hợp:

var s = "Hello\0World"; 

Ở trên sẽ không hoạt động như mong đợi. s sẽ bằng với chuỗi "HelloWorld".

Tại sao tính năng này không hoạt động?

+0

I nghĩ rằng Javascript không phải là C. vì vậy các byte null trong một chuỗi chỉ đơn giản là một byte null trong một chuỗi. –

+1

Hầu hết các ngôn ngữ theo truyền thống Pascal đại diện cho chuỗi như là một mảng với độ dài số nguyên (do đó cho phép ký tự null). C thực ra là cái lẻ trong ý nghĩa này. – hugomg

Trả lời

8

JavaScript không sử dụng chuỗi bị chấm dứt NULL, trong khi C thực hiện.

Chuỗi Javascript được lưu trữ bằng cách theo dõi các ký tự và độ dài riêng biệt thay vì cố giả định rằng NULL đánh dấu kết thúc chuỗi.

+0

Những gì * hiện * JS sử dụng cho chuỗi? – 0x499602D2

+0

Nó phân tách chúng bằng '" '.... – Nanne

2

Trong Javascript a NULL byte trong chuỗi chỉ đơn giản là một byte NULL trong một chuỗi. Nếu bạn muốn cắt ngắn chuỗi

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

nhưng trong trường hợp này tôi nghĩ rằng nó không cần phải làm phiền các byte null :)

4

Chuỗi C vẫn trỏ đến một địa chỉ trong bộ nhớ nơi "Hello \ 0World" được lưu trữ, chỉ rằng hầu hết các hàm xử lý chuỗi đều xem 0 kết thúc chuỗi. Đối với một số chức năng, bạn phải vượt qua một đối số độ dài chuỗi, nhưng hầu hết chỉ đọc cho đến khi chúng tìm thấy byte rỗng. Trong bộ nhớ chuỗi thực sự là "Hello \ 0World \ 0".

Một công cụ JavaScript không thể xác định độ dài chuỗi bằng cách tìm kiếm một byte rỗng, vì bạn trong trường hợp như vậy sẽ không bao giờ có thể có một nullbyte bên trong một chuỗi. Có lẽ có điều gì đó về điều đó trong các thông số kỹ thuật. Thay vào đó, công cụ phải lưu trữ độ dài của chuỗi riêng biệt và sau đó đọc nhiều ký tự đó từ bộ nhớ bất cứ khi nào bạn truy cập chuỗi.

Và cách phân tích cú pháp và lưu trữ kích thước bộ đệm đúng cách là ngôn ngữ kịch bản thường cố gắng ẩn khỏi người dùng. Đó là một nửa mục đích của kịch bản, không yêu cầu lập trình viên phải lo lắng về việc thêm 0 để tạo bộ đệm ký tự và lưu trữ chuỗi riêng biệt sao cho các hàm xử lý chuỗi không in một loạt các ký tự ngẫu nhiên bên ngoài bộ đệm của bạn tìm kiếm một nullbyte .. .

Vì vậy, chính xác chuỗi JavaScript hoạt động như thế nào? Tôi không biết, nó có thể lên đến động cơ để mô tả tính chất của nó trong chiều sâu. Miễn là bạn giao diện với đối tượng như đặc điểm kỹ thuật nói, nó có thể được thực hiện theo bất kỳ cách nào, sử dụng cấu trúc cho bộ đệm và độ dài, sử dụng ký tự dịch cho 0, sử dụng danh sách ký tự liên kết, v.v ...

Các vấn đề liên quan