2010-05-26 44 views
24

gcc 4.4.4 c89null chấm dứt chuỗi

Cách tiêu chuẩn để hủy kết thúc chuỗi là gì? Khi tôi sử dụng NULL tôi nhận được một thông báo cảnh báo.

*dest++ = 0; 
*dest++ = '\0'; 
*dest++ = NULL; /* Warning: Assignment takes integer from pointer without a cast */ 

Source code:

size_t s_strscpy(char *dest, const char *src, const size_t len) 
{ 
    /* Copy the contents from src to dest */ 
    size_t i = 0; 
    for(i = 0; i < len; i++) 
    *dest++ = *src++; 

    /* Null terminate dest */ 
    *dest++ = 0; 

    return i; 
} 

Câu hỏi khác: Tôi cố tình nhận xét ra các dòng đó là null chấm dứt. Tuy nhiên, nó vẫn chính xác in ra các nội dung của dest. Người gọi hàm này sẽ gửi độ dài của chuỗi bằng cách bao gồm NULL hay không. tức là strlen(src) + 1 hoặc stlen(src).

size_t s_strscpy(char *dest, const char *src, const size_t len) 
{ 
    /* Copy the contents from src to dest */ 
    size_t i = 0; 
    /* Don't copy the null terminator */ 
    for(i = 0; i < len - 1; i++) 
    *dest++ = *src++; 

    /* Don't add the Null terminator */ 
    /* *dest++ = 0; */ 

    return i; 
} 
+13

Tôi thích '* dest ++ = '\ 0'; 'vì' '\ 0'' có kiểu đúng trong ngữ cảnh này. –

+5

@Paul R: Tại sao bạn không trả lời câu hỏi này? – Lucas

+0

'* dest ++ = 0;' tại sao sau khi tăng con trỏ sau khi gán giá trị trì hoãn cho 0? – Larry

Trả lời

35

Để câu hỏi đầu tiên của bạn: Tôi sẽ đi với bình luận của Paul R và chấm dứt với '\0'. Nhưng giá trị 0 cũng hoạt động tốt. Một vấn đề của hương vị. Nhưng không sử dụng MACRO NULL có nghĩa là cho con trỏ.

Để câu hỏi thứ hai: Nếu chuỗi của bạn không bị chấm dứt với \0, nó vẫn có thể in kết quả mong đợi vì sau chuỗi của bạn là ký tự không thể in được trong bộ nhớ của bạn. Đây là một lỗi thực sự khó chịu mặc dù, vì nó có thể thổi lên khi bạn có thể không mong đợi nó. Luôn luôn chấm dứt chuỗi bằng '\0'.

7

'\ 0' là cách để thực hiện. Đó là một nhân vật, đó là những gì muốn trong một chuỗi và có giá trị null.

Khi chúng tôi nói chuỗi kết thúc bằng không trong C/C++, nó thực sự có nghĩa là 'không bị chấm dứt chuỗi'. Macro NULL không được dùng để chấm dứt chuỗi.

+0

''\ 0'', nếu nó là ký tự, là một ký tự khá lớn !. Tôi chắc chắn rằng trên hầu hết các máy ngày nay, với trình biên dịch 'C', bạn có sizeof ('\ 0') == 4. (Có thể 8031 ​​vi điều khiển là một ngoại lệ?). –

+0

@Joseph.Tôi không chắc bạn đến từ đâu. sizeof ('\ 0') xuất hiện dưới dạng 1 byte trên trình biên dịch của tôi. Đối với một ký tự byte kép, sizeof (L '\ 0') nó là 2. –

+6

Tôi kiểm tra lại: trong tệp .c là 4, trong khi trong tệp .cpp, hoặc với g ++, đó là 1. Câu hỏi là được gắn thẻ là C chứ không phải C++. –

11

Be rất cẩn thận: NULL là macro được sử dụng chủ yếu cho con trỏ. Các chuẩn cách chấm dứt một chuỗi là:

char *buffer; 
... 
buffer[end_position] = '\0'; 

này (dưới đây) cũng làm việc nhưng nó không phải là một sự khác biệt lớn giữa gán một giá trị số nguyên cho một int/ngắn/mảng dài và gán một giá trị nhân vật. Đây là lý do tại sao phiên bản đầu tiên được ưa thích và cá nhân tôi thích nó tốt hơn.

buffer[end_position] = 0; 
+0

''\ 0'' là hằng số loại 'int'in C. –

17

Từ FAQ comp.lang.c: http://c-faq.com/null/varieties.html

Về bản chất: NULL (vĩ mô Preprocessor cho con trỏ null) là không giống như NUL (các ký tự null).

+8

+1; nó thực sự lỗi tôi tất cả thời gian tôi thấy "NULL chấm dứt chuỗi": heck, chuỗi terminator không phải là NULL, nó là NUL! –

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