очистка массива символов c - PullRequest
99 голосов
/ 11 марта 2009

Я думал, что установив нулевым первый элемент, можно очистить все содержимое массива char.

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

Однако, это только устанавливает первый элемент в нуль.

или

my_custom_data[0] = 0; 

вместо использования memset, я думал, что 2 приведенных выше примера должны очистить все данные.

Ответы [ 16 ]

107 голосов
/ 11 марта 2009

Это зависит от того, как вы хотите просмотреть массив. Если вы просматриваете массив как последовательность символов, то единственный способ очистить данные - это прикоснуться к каждой записи. memset, вероятно, самый эффективный способ достичь этого.

С другой стороны, если вы решите просмотреть это как строку с нулевым символом в конце C / C ++, установка первого байта в 0 эффективно очистит строку.

69 голосов
/ 11 марта 2009

Массив в C - это просто место в памяти, поэтому ваше присвоение my_custom_data[0] = '\0'; просто устанавливает первый элемент на ноль и оставляет другие элементы без изменений.

Если вы хотите очистить все элементы массива, вам придется посетить каждый элемент. Вот для чего memset:

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

Как правило, это самый быстрый способ позаботиться об этом. Если вы можете использовать C ++, рассмотрите вместо этого std :: fill:

char *begin = &arr;
char *end = begin + sizeof(arr);
std::fill(begin, end, 0);
22 голосов
/ 11 марта 2009

Почему вы думаете, установка одного элемента очистит весь массив? В частности, в Си мало что происходит без явного программирования программистом. Если вы установили первый элемент на ноль (или любое значение), то вы сделали именно это, и ничего более.

При инициализации вы можете установить массив на ноль:

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

В остальном я не знаю никакой техники, кроме memset, или чего-то подобного.

10 голосов
/ 31 марта 2009

Использование:

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

Или:

memset(my_custom_data, 0, strlen(my_custom_data));
8 голосов
/ 10 декабря 2010

Попробуйте следующий код:

void clean(char *var) {
    int i = 0;
    while(var[i] != '\0') {
        var[i] = '\0';
        i++;
    }
}
7 голосов
/ 11 марта 2009

Почему бы не использовать memset()? Вот как это сделать.

Установка первого элемента оставляет остальную часть памяти нетронутой, но функции str будут обрабатывать данные как пустые.

6 голосов
/ 12 марта 2012

Пожалуйста, найдите ниже, где я объяснил с данными в массиве после случая 1 и случая 2.

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

Дело 1:

sc_ArrData[0] = '\0';

Результат:

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

Случай 2:

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

Результат:

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

Хотя установка первого аргумента в NULL поможет, рекомендуется использовать memset

4 голосов
/ 11 марта 2009

Неа. Все, что вы делаете, это устанавливаете первое значение равным '\ 0' или 0.

Если вы работаете со строкой с нулевым символом в конце, то в первом примере вы получите поведение, которое имитирует то, что вы ожидаете, однако память все еще установлена.

Если вы хотите очистить память без использования memset, используйте цикл for.

3 голосов
/ 11 марта 2009

Вы должны использовать memset. Установка только первого элемента не будет работать, вам нужно установить все элементы - если нет, как вы могли бы установить только первый элемент на 0?

2 голосов
/ 11 марта 2009

Запись нулевого символа в первый символ делает именно это. Если вы рассматриваете это как строку, код, подчиняющийся нулевому символу завершения, будет обрабатывать его как пустую строку, но это не то же самое, что очистка данных. Если вы действительно хотите очистить данные, вам нужно использовать memset.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...