2009-03-11 16 views
77

Myślałem, że ustawienie pierwszego elementu na wartość zerową spowoduje wyczyszczenie całej zawartości tablicy znaków.czyszczenie tablicy znaków c

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

Jednak to ustawia tylko pierwszy element na wartość null.

lub

my_custom_data[0] = 0; 

zamiast używać memset, myślałem powyżej przykłady 2 należy usunąć wszystkie dane.

+1

Jared, dlaczego ustawiłeś znacznik C++? mówił o "C" i nie dodawał żadnych tagów związanych z C++. –

+1

Dotyczy to również tablic znaków w C++, nawet jeśli nie został określony. –

+3

Usunąłem tag C++, aby uniknąć tego, co już widzieliśmy z ludźmi oferującymi rozwiązania specyficzne dla C++. – Alnitak

Odpowiedz

92

To zależy od tego, jak chcesz wyświetlić tablicę. Jeśli przeglądasz tablicę jako serię znaków, jedynym sposobem na wyczyszczenie danych jest dotknięcie każdego wpisu. memset jest prawdopodobnie najskuteczniejszym sposobem osiągnięcia tego.

Z drugiej strony, jeśli zdecydujesz się wyświetlić to jako łańcuch zakończony znakiem C/C++, ustawienie pierwszego bajtu na 0 skutecznie usunie ciąg znaków.

+0

lol I thoght to samo, gdy zobaczyłem, że +1 – hhafez

+4

Kluczowym słowem w odpowiedzi jest "skutecznie". Tylko pierwszy element zaczyna się od 0, a reszta ma niezdefiniowane wartości, ale jeśli traktujesz tablicę jako łańcuch zakończony wartością NUL, a pierwszy element ma wartość NULL, łańcuch jest pusty. –

+0

w rzeczy samej, to jest odpowiedź ludzi. –

3

Powinieneś użyć memsetu. Ustawienie tylko pierwszego elementu nie będzie działać, musisz ustawić wszystkie elementy - jeśli nie, jak ustawić tylko pierwszy element na 0?

+0

Nie należy używać zestawu memiec zamiast czytelności: http://stackoverflow.com/questions/453432/difference-in-initalizing- i-zerowanie-tablica-w-cc/455137 # 455137 –

+0

Od kiedy nie było możliwe odczytanie memsetu? – Inisheer

4

Nie. Wszystko, co robisz, ustawia pierwszą wartość na "\ 0" lub 0.

Jeśli pracujesz z łańcuchami zakończonymi znakiem NUL, to w pierwszym przykładzie otrzymasz zachowanie, które naśladuje to, czego się spodziewasz, jednak pamięć jest nadal ustawiony.

Jeśli chcesz wyczyścić pamięć bez użycia memsetu, użyj pętli for.

+0

Mówię "nie" w pętli for. Staraj się nie pisać własnych "ulepszonych" (i zazwyczaj nie) funkcji bibliotecznych. W rzeczywistości, memset i memcpy są raczej wyjątkowe, często są wstawiane do niestandardowego kodu maszynowego dla CPU w oparciu o informacje o wyrównaniu i długości danych. –

+0

@Zan OP nie chce używać memsetu (być może jest on osadzony i nie jest dostępny). Ale tak, memset jest zwykle wysoce optymalny i prawdopodobnie szybszy niż pętla for. –

+0

To prawda, jednak nie chciał używać memsetu, więc zasugerowałem pętlę for. – Alan

2

Pisanie znaku pustego do pierwszej postaci właśnie to robi. Jeśli traktujesz to jako ciąg znaków, kod przestrzegający znaku kończącego zero potraktuje go jako łańcuch pusty, ale to nie to samo, co czyszczenie danych. Jeśli chcesz rzeczywiście wyczyścić dane, musisz użyć memsetu.

59

Tablica w C jest po prostu miejscem w pamięci, tak naprawdę, twoje zadanie my_custom_data[0] = '\0'; po prostu ustawia pierwszy element na zero i pozostawia pozostałe elementy nienaruszone.

Jeśli chcesz usunąć wszystkie elementy tablicy, musisz odwiedzić każdy element. To, co jest dla memset:

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

ogół jest to najszybszy sposób, aby się tym zająć. Jeśli możesz używać C++, rozważ std :: fill zamiast:

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

Wierzę, że druga wersja powinna być: std :: fill (arr, arr + sizeof (arr)/sizeof (arr [0]), 0); –

+0

Wyjaśnienie: nie używaj sizeof z fill, ponieważ będziesz mieć kłopoty później z tablicami int, long, double lub co ty. –

+0

Preferuję: std :: fill (& arr [0], & arr [arr_len], 0); –

7

Dlaczego nie używać memset()? Tak to zrobić.

Ustawienie pierwszego elementu pozostawia resztę pamięci nietkniętą, ale funkcje str będą traktować dane jako puste.

+1

Nie używaj memsetu nad czytelnością: http://stackoverflow.com/questions/453432/difference-in-initalizing-and-zeroing-an-array-in-c-c/455137#455137 –

+1

i jaka jest wtedy twoja odpowiedź? – mkb

22

Dlaczego uważasz, że ustawienie jednego elementu spowoduje wyczyszczenie całej tablicy? W C, szczególnie mało dzieje się bez programisty jawnie programującego. Jeśli ustawisz pierwszy element na zero (lub dowolną wartość), to zrobisz dokładnie to i nic więcej.

Podczas inicjowania można ustawić tablicę do zera:

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

W przeciwnym razie, nie wiem dowolną techniką inną niż memset, lub coś podobnego.

+0

Chyba zależy to od używanego kompilatora: – cocoafan

+0

@ cocoafan: Nie, nie zależy to od kompilatora. Jest to część specyfikacji językowej. Każdy kompilator, który zachowuje się inaczej, nie jest zgodny z językiem C. – abelenky

+0

Nie wiedziałem tego, dziękuję. Nie mogłem znaleźć żadnego zasobu, w którym mógłbym przeczytać ten specjalny przypadek. Byłoby miło mieć to jako zakładkę. – cocoafan

1

myślałem przez ustawienie pierwszego elementu do null by wyczyścić całą zawartość tablicy char.

To nie jest poprawny, jak odkrył

Jednak to tylko ustawia pierwszy elementu na null.

Dokładnie!

Musisz użyć memset, aby wyczyścić wszystkie dane, nie wystarczy ustawić jednego z wpisów na wartość null.

Jeśli jednak ustawienie elementu tablicy na wartość null oznacza coś specjalnego (na przykład przy użyciu łańcucha kończącego zawierającego zero), może wystarczyć ustawienie pierwszego elementu na wartość null. W ten sposób każdy użytkownik tablicy zrozumie, że jest on pusty, mimo że tablica nadal zawiera stare znaki w pamięci

+0

Nie należy używać "memset" w stosunku do czytelności: http://stackoverflow.com/questions/453432/difference-in-initalising-and-zeroing-an-array-in-cc/455137 # 455137 –

10

Zastosowanie:

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

Lub:

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

ustawić pierwszy element do NULL. wydrukowanie tablicy znaków nic ci nie da.

6

Wypróbuj poniższy kod:

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

FYI - kod wcięcia 4 spacje lub wybierz go i naciśnij przycisk "kod", który wygląda jak dwie linie binarny. – meagar

-4

Spróbuj wykonać następujące czynności:

strcpy(my_custom_data,""); 
5

Pls znaleźć poniżej gdzie wyjaśniłem z danymi w tablicy po Przypadek 1 & przypadku 2.

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

Przypadek 1:

sc_ArrData[0] = '\0'; 

Wynik:

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

Przypadek 2:

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

Wynik:

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

Choć ustawienie pierwszy argument NULL rade, przy użyciu memset jest wskazane

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

To nie jest USUWANIE, tylko ustawienie pierwszego znaku na ""! Myślę, że chcesz napisać * input = '\ 0' – stviper

0

ja zwykle po prostu zrobić tak:

memset(bufferar, '\0', sizeof(bufferar)); 
Powiązane problemy