Как очистить массив символов?

Иметь массив символов, таких как члены 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.10.2009 10:51:46
Что вы имеете в виду «пустой массив»?
pmg 13.10.2009 10:53:43
members [0] = members [1] = members [2] = members [3] ... = members [255] = 0 циклов нет;)
John La Rooy 13.10.2009 11:18:18
Таким образом, ваш «массив» - это особый вид массива: это string. Чтобы «очистить» строку, установите для ее первого элемента значение «\ 0»:members[0] = '\0';
pmg 13.10.2009 11:27:59
Сообщество, кажется, в пользу memset. Но это самый эффективный способ, учитывая мои требования?
Alex Xander 13.10.2009 11:48:49
@ Алекс Ксандер: «Сообщество» явно неправильно в этом случае. Существуют ситуации, которые требуют «memset» (например, стирание данных для предотвращения несанкционированного использования), но для простого сброса строки (как в вашем случае) правильный ответ - обнулить только первый элемент.
AnT 13.10.2009 14:11:51
13 ОТВЕТОВ
РЕШЕНИЕ

с помощью

  memset(members, 0, 255);

В основном

  memset(members, 0, sizeof members);

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

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

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


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


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

150
28.05.2016 13:30:33
+1 - я бы пошел на это, поскольку он гарантирует, что все элементы массива находятся в известном состоянии.
ChrisBD 13.10.2009 11:01:27
Однако это противоречит (эпическому) требованию не использовать цикл.
Michael Foukarakis 13.10.2009 11:13:24
Хотя memset, вероятно, не реализован как рекурсия, это может быть - в любом случае, итерация прилично скрыта от глаз, что было очевидным требованием.
Steve Gilham 13.10.2009 11:22:42

Я бы пошел с

members_in_use = 0;
2
13.10.2009 10:54:51
Это на самом деле имеет большой смысл, так как OP запрашивает операцию (очистку), которая не является частью массива C - поэтому в идеале он должен реализовать новую структуру данных, а способ pmg сигнализировать о структуре - пусто достаточно хорош
Michael Foukarakis 13.10.2009 11:09:23
Нет, это действительно не имеет никакого смысла.
user181548 13.10.2009 11:12:17
Кинопико: Видимо, вы не понимаете подход тогда
Christian 13.10.2009 11:25:42
Кинопико: прочитайте звездный ответ, поскольку он объясняет мои рассуждения лучше, чем я могу объяснить в комментарии (спасибо, звездный)
pmg 13.10.2009 11:33:14
Хм, это интересный подход, будут ли members_in_use по-прежнему быть массивом? Могу ли я позже сделать; member_in_use [5] = значение? Это эквивалентно memset (members_in_use, 0, 255); как сказал Стив? Если так, зачем использовать один вместо другого?
user689383 30.01.2015 18:06:25

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

7
13.10.2009 10:55:12
Нет, потому что он не указал, что это должно быть сделано после инициализации. Особенно это могло быть понято по его первому примеру перед редактированием и потому что это также очень распространенный вариант использования для очистки массива.
user44556 13.10.2009 11:14:35
Я даю вам +2 в качестве компенсации, которую он дал вам -1: P: D
stviper 18.09.2014 13:20:49

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

members[0] = '\0';
34
13.10.2009 10:55:37
Это изменило бы только значение members [0], а не members [1] через members [254]. Хорошо, если вы обращаетесь последовательно ... но не так хорошо в других случаях.
Thomas Owens 13.10.2009 11:05:55
Похоже, что после редактирования OP мое решение должно работать для его требований, так как strcat () найдет байт NULL и обработает его соответствующим образом.
Felix 13.10.2009 11:09:05
Не лучшее решение. Просто решение другой проблемы.
ypnos 13.10.2009 11:47:09
Нет никакого способа «очистить» абстрактный массив в C. Каждый массив содержит что-то, даже если это нули. Понятие «очистка массива» применимо только к логическим интерпретациям содержимого массива более высокого уровня. Например, содержимое массива может быть интерпретировано как C-строка. В этом случае правильный способ «опустошить» это установить самый первый элемент на «\ 0». Именно то, что сделал Феликс. Я не знаю, какие другие интерпретации может иметь в виду ОП, но без уточнения все эти попытки с «memset» являются просто бессмысленными ответами на бессмысленный вопрос.
AnT 13.10.2009 13:52:01
@tinkertim: здесь нет NULL. И нет, strcat не знает, как обрабатывать NULL. Он потерпит крах, если вы передадите ему значение NULL.
AnT 13.10.2009 14:33:53

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

char members[255] = { 0 };

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

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

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

4
13.10.2009 11:08:30
Это зависит от того, как вы определяете «пустой». Символ со значением 0 не является читаемым человеком символом, а массив символов находится в известном состоянии. Я бы посчитал это пустым. Он также делает то же самое, что и memset (если мои воспоминания о memset верны - прошло слишком много времени с тех пор, как я использовал C).
Thomas Owens 13.10.2009 11:04:20

Под «очистить массив», если вы имеете в виду сброс на 0, вы можете использовать bzero.

#include <strings.h>  
void bzero(void *s, size_t n);  

Если вы хотите заполнить массив другим символом по умолчанию, вы можете использовать функцию memset.

#include <string.h>  
void *memset(void *s, int c, size_t n);  
1
13.10.2009 11:03:32
bzero и memset (обычно) используют цикл.
Michael Foukarakis 13.10.2009 11:06:17

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

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

3
13.10.2009 11:04:33
members[0] = 0;

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

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

2
13.10.2009 11:04:45
Можно также записать как * members = 0;
eyalm 13.10.2009 12:11:19

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

Если «emptying» означает «содержащий пустую строку», вы можете просто присвоить первому элементу массива ноль, что фактически сделает массив содержащим строку empry:

members[0] = 0;

Если «опорожнение» означает «освобождение используемой памяти», вы не должны использовать фиксированный массив символов. Скорее, вы должны определить указатель на char, а затем выполнить malloc / free (или присваивание строки) в зависимости от ситуации.

Пример использования только статических строк:

char* emptyString="";
char* members;

//Set string value
members = "old value";

//Empty string value
member = emptyString

//Will return just "new"
strcat(members,"new");
0
13.10.2009 11:33:32

проще проще - имеет смысл?

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

1
13.10.2009 13:16:34

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

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

strcpy(members, "hello");

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

strcat(members, " world");

Пустой строкой:

members[0] = 0;

Просто так.

5
22.08.2015 06:04:41

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

3
30.11.2011 17:08:54

Вы можете использовать следующую инструкцию:

strcpy_s(members, "");
0
30.10.2017 04:22:33