2011-12-12 25 views
7

Tôi đang đọc số Lua reference manual và nó nói về "số không được nhúng", được ký hiệu là "\ 0".Số không được nhúng là gì?

Khi tôi cố gắng nhìn thấy nó trong Lua console, nó in không có gì ý nghĩa:

> print "a \0 b" 
a 

Vì vậy, đây "không nhúng" là gì?

+1

Dường như đó là giá trị NULL .. – clyfe

+0

'NUL', nghĩa là, byte số không. – lhf

Trả lời

14

Mỗi ký tự có một biểu diễn số bên trong, chẳng hạn như \ 97 cho 'a'. Một ký tự có mã \ 0 không đại diện cho bất kỳ ký tự nào có thể nhìn thấy nhưng được sử dụng như một terminator trong C và các ngôn ngữ lập trình khác.

Hướng dẫn muốn làm rõ rằng '\ 0' là không phải là một bộ kết thúc ở Lua. Nó cũng có nghĩa là bạn có thể tải các byte tùy ý thành một chuỗi (hình ảnh, âm thanh, video, mã nguồn gốc, v.v.) và bạn không có nguy cơ bị cắt ngắn tại '\ 0' đầu tiên bởi một số chức năng thư viện (có thể xảy ra trong C) nếu bạn sử dụng các hàm liên quan đến chuỗi).

+1

Vâng, có vẻ như in trong Lua 5.1 không cắt đầu ra. Tôi đoán nó chỉ là một trường hợp góc, và nó sẽ được cố định trong Lua 5.2 – marcus

+0

sắp tới đầu ra là một tác dụng phụ của việc in bằng cách sử dụng 'puts' từ C – daurnimator

0

Ký tự rỗng thường được trình bày là chuỗi thoát \ 0 trong chuỗi ký tự chuỗi mã hoặc hằng số ký tự.

Wikipedia Null Character

1

Nó sẽ là tương tự như việc đưa một nhân vật NULL trong một chuỗi C. Mặc dù đầu ra in của bạn không hiển thị ký tự b, nhưng các hàm Lua khác sẽ hoạt động với độ dài đầy đủ của chuỗi (không giống như các hàm xử lý chuỗi C hoạt động với các chuỗi bị chấm dứt NULL).

Một cách sử dụng này sẽ là sử dụng một chuỗi để giữ nhiều giá trị được phân tách bằng \0.

+0

Hầu hết các chức năng trong Lua thực sự làm việc quá khứ '\ 0'. Giống như thử 'print (s: byte (1, -1))' hoặc 'cho b trong s: gmatch '.' Làm print (b) end'. Tôi đoán đó là lý do tại sao in chỉ để gỡ lỗi nhanh: "in không dành cho định dạng đầu ra, nhưng chỉ là cách nhanh chóng để hiển thị giá trị, thường là để gỡ lỗi" – jpjacobs

+0

@jpjacobs: Rất tiếc. Đã một thời gian kể từ khi tôi đã thực hiện nhiều trong Lua. Tôi đã cập nhật câu trả lời của mình. – crashmstr

3

\0 chỉ là một byte có giá trị bằng 0, không cần bất kỳ tên lạ mắt nào. Chuỗi Lua chỉ là các chuỗi byte để theo dõi độ dài của chúng, vì vậy chúng có thể chứa bất kỳ giá trị byte nào, không bao gồm. Một số hàm xử lý các chuỗi byte như thể chúng là các chuỗi C kết thúc bằng \0, rõ ràng là print thực hiện điều này.

Điều này có nghĩa là trong lua, #s (độ dài chuỗi) là O (1) so với O (n) cho chuỗi C. Và ứng dụng có thể sử dụng các chuỗi lua cho bất kỳ luồng byte nào, ví dụ như nội dung tệp được mã hóa hoặc nội dung tệp nhị phân UTF-16.

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