2009-03-11 40 views
77

Tôi nghĩ bằng cách đặt phần tử đầu tiên thành một giá trị rỗng sẽ xóa toàn bộ nội dung của mảng char.xoá một mảng char c

char my_custom_data[40] = "Hello!"; 
my_custom_data[0] = '\0'; 

Tuy nhiên, điều này chỉ đặt thành phần đầu tiên thành vô giá trị.

hoặc

my_custom_data[0] = 0; 

hơn là sử dụng memset, tôi nghĩ 2 ví dụ trên nên xóa tất cả các dữ liệu.

+1

Jared, tại sao bạn đặt thẻ C++? ông đã nói về "C" và không thêm bất kỳ thẻ liên quan C++ nào. –

+1

Điều này áp dụng tốt cho các mảng ký tự trong C++, mặc dù anh ta không chỉ rõ. –

+3

Tôi đã xóa thẻ C++ để tránh những gì chúng tôi đã thấy với những người cung cấp giải pháp cụ thể C++ – Alnitak

Trả lời

92

Tùy thuộc vào cách bạn muốn xem mảng. Nếu bạn đang xem mảng như một loạt các char thì cách duy nhất để xóa dữ liệu là chạm vào mọi mục nhập. memset có lẽ là cách hiệu quả nhất để đạt được điều này.

Mặt khác, nếu bạn chọn xem này dưới dạng chuỗi kết thúc rỗng C/C++, việc đặt byte đầu tiên thành 0 sẽ xóa chuỗi có hiệu quả.

+0

lol Tôi thoght cùng một điều khi tôi thấy rằng +1 – hhafez

+4

Họ từ khóa trong câu trả lời là 'hiệu quả'. Chỉ phần tử đầu tiên bắt đầu được đặt thành 0 và phần tử còn lại vẫn có giá trị không xác định nhưng nếu bạn đang xử lý mảng dưới dạng chuỗi bị hủy null và phần tử đầu tiên là null, thì chuỗi được coi là rỗng. –

+0

thực sự, đây là câu trả lời folks. –

3

Bạn nên sử dụng memset. Việc thiết lập phần tử đầu tiên sẽ không hoạt động, bạn cần phải thiết lập tất cả các phần tử - nếu không, làm thế nào bạn có thể thiết lập phần tử đầu tiên là 0?

+0

memset không nên được sử dụng trên khả năng đọc: http://stackoverflow.com/questions/453432/difference-in-initalizing- và-zeroing-an-array-in-cc/455137 # 455137 –

+0

Từ khi nào không thể đọc được memset? – Inisheer

4

Không. Tất cả những gì bạn đang làm là đặt giá trị đầu tiên thành '\ 0' hoặc 0.

Nếu bạn đang làm việc với chuỗi bị chấm dứt null, thì trong ví dụ đầu tiên, bạn sẽ nhận được hành vi bắt chước những gì bạn mong đợi, tuy nhiên bộ nhớ vẫn được đặt.

Nếu bạn muốn xóa bộ nhớ mà không sử dụng bộ nhớ, hãy sử dụng vòng lặp for.

+0

Tôi nói không có trên vòng lặp for. Cố gắng không viết các hàm thư viện "cải thiện" (và thường không) của riêng bạn. Trong thực tế, memset và memcpy khá đặc biệt thường được đưa vào mã máy tùy chỉnh cho CPU dựa trên những gì được biết về sự liên kết dữ liệu và độ dài. –

+0

@Zan OP không muốn sử dụng memset (có lẽ anh ta đã nhúng và không có sẵn). Nhưng có, memset thường rất tối ưu, và có khả năng nhanh hơn vòng lặp for. –

+0

Đúng, tuy nhiên ông không muốn sử dụng memset, vì vậy tôi đề xuất một vòng lặp for. – Alan

2

Viết ký tự rỗng cho ký tự đầu tiên thực hiện điều đó. Nếu bạn xử lý nó như là một chuỗi, mã tuân theo ký tự chấm dứt null sẽ coi nó như là một chuỗi rỗng, nhưng điều đó không giống như xóa dữ liệu. Nếu bạn muốn thực sự xóa dữ liệu bạn cần sử dụng memset.

59

Một mảng trong C chỉ là một vị trí bộ nhớ, do đó, thực sự, nhiệm vụ my_custom_data[0] = '\0'; của bạn chỉ cần đặt thành phần đầu tiên về 0 và để nguyên các phần tử còn nguyên vẹn.

Nếu bạn muốn xóa tất cả các phần tử của mảng, bạn sẽ phải truy cập từng phần tử. Đó là những gì memset là dành cho:

memset(&arr[0], 0, sizeof(arr)); 

Đây thường là cách nhanh nhất để chăm sóc điều này. Nếu bạn có thể sử dụng C++, hãy xem xét std :: fill thay thế:

char *begin = &arr; 
char *end = begin + sizeof(arr); 
std::fill(begin, end, 0); 
+0

Tôi tin rằng phiên bản thứ hai nên là: std :: điền (arr, arr + sizeof (arr)/sizeof (arr [0]), 0); –

+0

Làm rõ: không sử dụng sizeof với điền bởi vì bạn sẽ gặp rắc rối sau với mảng int, dài, gấp đôi hoặc những gì có bạn. –

+0

Tôi thích: std :: fill (& arr [0], & arr [arr_len], 0); –

7

Tại sao không sử dụng memset()? Đó là cách để làm điều đó.

Đặt phần tử đầu tiên để phần còn lại của bộ nhớ bị ảnh hưởng, nhưng các hàm str sẽ xử lý dữ liệu là trống.

+1

Không sử dụng memset để dễ đọc: http://stackoverflow.com/questions/453432/difference-in-initalizing-and-zeroing-an-array-in-c-c/455137#455137 –

+1

và câu trả lời của bạn là gì? – mkb

22

Tại sao bạn nghĩ đặt một phần tử sẽ xóa toàn bộ mảng? Trong C, đặc biệt, ít xảy ra mà không có lập trình lập trình rõ ràng nó. Nếu bạn đặt phần tử đầu tiên thành 0 (hoặc bất kỳ giá trị nào), thì bạn đã thực hiện chính xác điều đó và không có gì khác.

Khi khởi tạo bạn có thể đặt một mảng để zero:

char mcd[40] = {0}; /* sets the whole array */ 

Nếu không, tôi không biết bất kỳ kỹ thuật khác hơn memset, hoặc một cái gì đó tương tự.

+0

Tôi đoán điều này phụ thuộc vào trình biên dịch bạn sử dụng – cocoafan

+0

@cocoafan: Không, nó không phải là trình biên dịch phụ thuộc. Nó là một phần của đặc tả ngôn ngữ. Bất kỳ trình biên dịch nào hoạt động khác đều không tuân theo ngôn ngữ C. – abelenky

+0

Tôi không biết điều đó, cảm ơn bạn. Tôi không thể tìm thấy bất kỳ tài nguyên nào mà tôi có thể đọc trường hợp đặc biệt này. Sẽ được tốt đẹp để có nó như là một bookmark. – cocoafan

1

Tôi nghĩ bằng cách đặt thành phần đầu tiên thành giá trị rỗng sẽ xóa toàn bộ nội dung của mảng char.

Đó không phải là chính xác như bạn phát hiện

Tuy nhiên, điều này chỉ đặt yếu tố đầu tiên để null.

Chính xác!

Bạn cần sử dụng bộ nhớ để xóa tất cả dữ liệu, không đủ để đặt một trong các mục nhập thành rỗng.

Tuy nhiên, nếu thiết lập một phần tử của mảng thành null có nghĩa là một cái gì đó đặc biệt (ví dụ khi sử dụng một chuỗi kết thúc null), nó có thể đủ để đặt phần tử đầu tiên thành rỗng. Bằng cách đó bất kỳ người sử dụng của mảng sẽ hiểu rằng nó là trống mặc dù mảng vẫn bao gồm các ký tự cũ trong ký ức

+0

Không sử dụng "memset" trên khả năng đọc: http://stackoverflow.com/câu hỏi/453432/khác biệt-in-initalizing-and-zeroing-an-array-in-cc/455137 # 455137 –

10

Sử dụng:

memset(my_custom_data, 0, sizeof(my_custom_data)); 

Hoặc:

memset(my_custom_data, 0, strlen(my_custom_data)); 
1

thiết lập các yếu tố đầu tiên thành NULL. in mảng char sẽ cung cấp cho bạn không có gì trở lại.

6

Hãy thử đoạn mã sau:

void clean(char *var) { 
    int i = 0; 
    while(var[i] != '\0') { 
     var[i] = '\0'; 
     i++; 
    } 
} 
+2

FYI - thụt lề mã bằng 4 dấu cách hoặc chọn nó và nhấn nút 'mã', trông giống như hai dòng của nhị phân. – meagar

-4

Hãy thử như sau:

strcpy(my_custom_data,""); 
5

Xin vui lòng tìm thấy bên dưới nơi tôi đã giải thích với dữ liệu trong mảng sau khi trường hợp 1 & trường hợp 2.

char sc_ArrData[ 100 ]; 
strcpy(sc_ArrData,"Hai"); 

Trường hợp 1:

sc_ArrData[0] = '\0'; 

Kết quả:

- "sc_ArrData" 
[0] 0 '' 
[1] 97 'a' 
[2] 105 'i' 
[3] 0 '' 

Trường hợp 2:

memset(&sc_ArrData[0], 0, sizeof(sc_ArrData)); 

Kết quả:

- "sc_ArrData" 
[0] 0 '' 
[1] 0 '' 
[2] 0 '' 
[3] 0 '' 

Mặc dù thiết đối số đầu tiên để NULL sẽ làm các trick, sử dụng memset là khuyến khích

1

Làm thế nào về những điều sau đây:

bzero(my_custom_data,40); 
-3
void clearArray (char *input[]){ 
    *input = ' '; 
} 
+1

Đây không phải là R CLE RÀNG, nó chỉ là thiết lập ký tự đầu tiên thành ''! Tôi nghĩ bạn muốn viết * input = '\ 0' – stviper

0

Tôi thường chỉ làm như thế này:

memset(bufferar, '\0', sizeof(bufferar));