2011-11-12 18 views
31

Tôi đã làm việc trên một dự án trong C yêu cầu tôi phải làm rối tung nhiều chuỗi. Thông thường, tôi làm chương trình trong C + +, do đó, đây là một chút khác nhau hơn so với chỉ nói string.empty().Cách thích hợp để làm trống một C-String

Tôi tự hỏi điều gì sẽ là cách thích hợp để xóa một chuỗi trong C. Có phải không?

 
buffer[80] = "Hello World!\n"; 

// ... 

strcpy(buffer, ""); 
+0

Ví dụ của bạn khó hiểu. Rõ ràng bộ đệm đã được khai báo ở một nơi khác và bạn cố gắng khởi tạo nó từ một chữ. Không cần phải xóa bất cứ điều gì ở đây. – pmr

+1

string.empty() không sửa đổi chuỗi –

Trả lời

55

Nó phụ thuộc vào những gì bạn có ý nghĩa bởi "trống rỗng". Nếu bạn chỉ muốn một chuỗi có độ dài bằng không, thì ví dụ của bạn sẽ hoạt động.

này cũng sẽ làm việc:

buffer[0] = '\0'; 

Nếu bạn muốn bằng không toàn bộ nội dung của chuỗi, bạn có thể làm theo cách này:

memset(buffer,0,strlen(buffer)); 

nhưng điều này sẽ chỉ làm việc cho zeroing lên đến ký tự NULL đầu tiên.

Nếu chuỗi là một mảng tĩnh, bạn có thể sử dụng:

memset(buffer,0,sizeof(buffer)); 
+2

Để làm rõ, phương thức cuối cùng sẽ hoạt động nếu 'buffer' là một mảng, nhưng không phải nếu nó là một con trỏ. Trình biên dịch phải có khả năng xem kích thước của mảng.Nếu 'buffer' là một con trỏ, nó sẽ chỉ bằng 0 kích thước của một con trỏ, có thể là 4 hoặc 8 byte. –

1

Phụ thuộc vào ý bạn bằng cách đổ. Nếu bạn chỉ muốn một chuỗi rỗng, bạn có thể làm

buffer[0] = 0; 

Nếu bạn muốn thiết lập mọi phần tử bằng không, làm

memset(buffer, 0, 80); 
2

Hai cách khác là strcpy(str, "");string[0] = 0

Để thực sự xóa các nội dung Variable (trong trường hợp bạn có mã bẩn mà không phải là làm việc đúng với các đoạn mã trên: P) sử dụng một vòng lặp như trong ví dụ bên dưới.

#include <string.h> 

... 

int i=0; 
for(i=0;i<strlen(string);i++) 
{ 
    string[i] = 0; 
} 

Trong trường hợp bạn muốn xóa một mảng phân bổ năng động của chars từ đầu, bạn có thể sử dụng một sự kết hợp của malloc() và memset() hoặc - và đây là cách nhanh hơn - calloc() mà làm điều tương tự như malloc nhưng khởi tạo toàn bộ mảng với Null.

Cuối cùng, tôi muốn bạn ghi nhớ thời gian chạy của mình. Tất cả các cách khác, nếu bạn đang xử lý các mảng lớn (6 chữ số trở lên), bạn nên cố gắng đặt giá trị đầu tiên thành Null thay vì chạy memset() thông qua toàn bộ Chuỗi.

Lúc đầu trông có vẻ bẩn hơn nhưng nhanh hơn. Bạn chỉ cần chú ý thêm về mã của bạn;)

Tôi hy vọng điều này là hữu ích cho bất cứ ai;)

0

nhu cầu tên của chuỗi và chiều dài của nó sẽ bằng không tất cả các nhân vật phương pháp khác có thể dừng lại ở số không đầu tiên họ gặp phải

void strClear(char p[],u8 len){u8 i=0; 
     if(len){while(i<len){p[i]=0;i++;}} 
    } 
Các vấn đề liên quan