очистка массива с


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

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

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

или

my_custom_data[0] = 0; 

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

16 88

16 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

или:

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

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

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

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

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

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

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

Пример 1:

sc_ArrData[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 рекомендуется

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

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

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

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

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

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

это не правильно, как вы обнаружили

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

точно!

вы должны использовать memset, чтобы очистить все данные, это не достаточно, чтобы установить одну из записей в null.

однако, если элемент массива значение null означает что-то особенное (например, при использовании завершающей строки null) может быть достаточно установить первый элемент в значение null. Таким образом, любой пользователь массива поймет, что он пуст, даже если массив по-прежнему содержит старые символы в памяти

установите для первого элемента значение NULL. печать массива символов не даст вам ничего взамен.

Как насчет следующего:

bzero(my_custom_data,40);

Я обычно делаю так:

memset(bufferar, '', sizeof(bufferar));
void clearArray (char *input[]){
    *input = ' '; 
}

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

strcpy(my_custom_data,"");