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

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

В мире OO, объекты являются основной вещью интереса. Объект состоит из данных и код, которому позволяют действовать на те данные, и они очень плотно связываются. Это - понятие инкапсуляции, сокрытие информации.

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

n = n * 2

код здесь вполне явно умножается на n на 2 и хранит результат назад в n.

OO способ сделать это состоит в том, чтобы отправить "сообщение" в объект числа сообщение этого удвоить себя:

n.double();

преимущество этого называют полиморфизмом. Что происходит, когда Вы решаете, что хотите смочь удвоить строку как "боб". В процедурном мире необходимо было бы предоставить больше кода, чтобы сделать удвоение, но необходимо будет также назвать тот код по-другому.

С OO, Вы создаете строковый объект, который может также взять 'двойное' сообщение. Код для удвоения строки принадлежит строковому объекту, таким образом, это знает, что должно действовать по-другому к объекту числа. Если бы это решило, что "боб" * 2 был "bobbob", то код посмотрел бы что-то как:

class number:                    class string:
    int n                           char array s
    procedure double:               procedure double:
        n = n * 2                       s = string_join(s,s)

Затем Вы могли назвать x.double () независимо от того, чем был фактический тип x (число или строка), и это будет знать, какой код работать - это значительно упрощает Ваш код. Можно удвоить целое число, строки, матрицы, комплексные числа, реалы, размеры окна на мониторе и всех видах разных вещей.

И Вы правы, библиотека C может быть заставлена немного походить на объекты. Классический пример stdio.h - Вы никогда не заботитесь , что FILE* на самом деле точки к, просто то, что он будет вести себя определенным способом. FILE*, fopen(), fclose() и другие функции класс своего рода представление возможностей ввода-вывода C.

70
задан Alex Xander 13 October 2009 в 11:43
поделиться

11 ответов

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

  memset(members, 0, 255);

в целом

  memset(members, 0, sizeof members);

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

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

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


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


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

144
ответ дан 24 November 2019 в 13:15
поделиться

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

members[0] = '\0';
33
ответ дан 24 November 2019 в 13:15
поделиться

элементы char [255] = {0};

7
ответ дан 24 November 2019 в 13:15
поделиться

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

char members[255] = { 0 };

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

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

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

4
ответ дан 24 November 2019 в 13:15
поделиться

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

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

3
ответ дан 24 November 2019 в 13:15
поделиться

Я бы выбрал

members_in_use = 0;
2
ответ дан 24 November 2019 в 13:15
поделиться
members[0] = 0;

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

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

2
ответ дан 24 November 2019 в 13:15
поделиться

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

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

1
ответ дан 24 November 2019 в 13:15
поделиться

Под "очисткой массива", если вы имеете в виду сброс на 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
ответ дан 24 November 2019 в 13:15
поделиться

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

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

strcpy(members, "hello");

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

strcat(members, " world");

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

members[0] = 0;

Вот так просто.

4
ответ дан 24 November 2019 в 13:15
поделиться

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

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

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
ответ дан 24 November 2019 в 13:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: