Как очистить массив символов? - PullRequest
66 голосов
/ 13 октября 2009

Иметь массив символов, таких как члены char [255]. Как я могу полностью очистить его без использования цикла?

char members[255];

Под «пустым» я подразумеваю, что если в нем хранятся некоторые значения, то это не должно быть. Например, если я делаю strcat, то старое значение не должно оставаться

members = "old value";

//empty it efficiently
strcat(members,"new"); // should return only new and not "old value new"

Ответы [ 13 ]

136 голосов
/ 13 октября 2009

с помощью

  memset(members, 0, 255);

в целом

  memset(members, 0, sizeof members);

, если массив находится в области видимости, или

  memset(members, 0, nMembers * (sizeof members[0]) );

если у вас есть только значение указателя, а nMembers - количество элементов в массиве.


РЕДАКТИРОВАТЬ Конечно, теперь требование изменилось с обычной задачи очистки массива на чистую перезагрузку строки, memset излишне и достаточно просто обнуления первого элемента (как отмечено в других ответах).


РЕДАКТИРОВАТЬ Чтобы использовать memset , вам необходимо включить string.h .

33 голосов
/ 13 октября 2009

Зависит от того, что вы подразумеваете под «пустым»:

members[0] = '\0';
7 голосов
/ 13 октября 2009

члены-члены [255] = {0};

4 голосов
/ 13 октября 2009

Не пытайтесь обнулять ваш массив символов, если вы имеете дело со строками. Ниже приведен простой способ работы со строками char.

Копировать (назначить новую строку):

strcpy(members, "hello");

Объединить (добавить строку):

strcat(members, " world");

Пустая строка:

members[0] = 0;

Просто так.

4 голосов
/ 13 октября 2009

РЕДАКТИРОВАТЬ: Учитывая последнее изменение вопроса, это больше не будет работать, так как нет нулевого завершения - если вы попытаетесь напечатать массив, вы получите ваши символы, после количество нечитаемых человеком символов. Однако я оставляю этот ответ здесь как вики сообщества для потомков.

char members[255] = { 0 };

Это должно сработать. Согласно языку программирования C:

Если массив имеет фиксированный размер, количество инициализаторов не может превышать количество членов массива; если их меньше, остальные члены инициализируются с 0.

Это означает, что каждый элемент массива будет иметь значение 0. Я не уверен, что это то, что вы бы посчитали «пустым» или нет, поскольку 0 является допустимым значением для char.

3 голосов
/ 13 октября 2009

Вы не можете очистить массив как таковой, он всегда содержит одинаковое количество данных.

В большем контексте данные в массиве могут представлять пустой список элементов, но это должно быть определено в дополнение к массиву. Наиболее распространенные способы сделать это - сохранить количество допустимых элементов (см. Ответ по pmg) или строки, завершающие их нулевым символом (ответ Феликса). Есть и более сложные способы, например, кольцевой буфер использует два индекса для позиций, где данные добавляются и удаляются.

2 голосов
/ 30 ноября 2011

Использование bzero(array name, no.of bytes to be cleared);

2 голосов
/ 13 октября 2009
members[0] = 0;

достаточно, учитывая ваши требования.

Обратите внимание, что это не «очистка» буфера. Память по-прежнему распределена, в ней могут существовать допустимые значения символов и т. Д.

2 голосов
/ 13 октября 2009

Я бы пошел с

members_in_use = 0;
1 голос
/ 13 октября 2009

проще, лучше - имеет смысл?

в этом случае просто members [0] = 0 работает. не делай простой вопрос таким сложным.

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