В процедурной программе код является королем, и данные зависимы. Другими словами, у Вас есть программы, которые действуют на данные, и они обычно плотно не связываются.
В мире 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.
с использованием
memset(members, 0, 255);
в целом
memset(members, 0, sizeof members);
, если массив находится в области видимости, или
memset(members, 0, nMembers * (sizeof members[0]) );
, если у вас есть только значение указателя, а nMembers - количество элементов в массиве.
РЕДАКТИРОВАТЬ Конечно, теперь требование изменилось с общей задачи очистки массива на чистый сброс строки, memset
является излишним, и достаточно обнуления первого элемента (как указано в других ответах).
РЕДАКТИРОВАТЬ Чтобы использовать memset , вы должны включить string.h .
Зависит от того, что вы подразумеваете под «пустым»:
members[0] = '\0';
РЕДАКТИРОВАТЬ: Учитывая последнее изменение вопроса, это не будет больше работать, поскольку нет нулевого завершения - если вы попытаетесь распечатать массив, вы получите свои символы, за которыми следует ряд символов, нечитаемых человеком. Однако я оставляю этот ответ здесь как вики сообщества для потомков.
char members[255] = { 0 };
Это должно сработать. Согласно языку программирования C:
Если массив имеет фиксированный размер, количество инициализаторов не может превышать количество членов массива; если их меньше, оставшиеся элементы инициализируются значением 0.
Это означает, что каждый элемент массива будет иметь значение 0. Я не уверен, что вы считаете это «пустым» или нет, поскольку 0 - допустимое значение для char
.
Вы не можете очистить массив как таковой, он всегда содержит одинаковое количество данных.
В более широком контексте данные в массиве могут представлять собой пустой список элементов, но это должно быть определено в дополнение к массиву. Наиболее распространенные способы сделать это - вести подсчет допустимых элементов (см. Ответ pmg) или завершать строки нулевым символом (ответ Феликса). Существуют также более сложные способы, например кольцевой буфер использует два индекса для позиций, в которые данные добавляются и удаляются.
members[0] = 0;
достаточно, учитывая ваши требования.
Обратите внимание, однако, это не "опустошение" буфера. Память по-прежнему выделена, в ней могут существовать допустимые значения символов и т. Д.
Чем проще, тем лучше - имеет смысл?
в этом случае работает только members [0] = 0. не делайте простой вопрос таким сложным.
Под "очисткой массива", если вы имеете в виду сброс на 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);
Не пытайтесь обнулить массив символов, если вы имеете дело со строками. Ниже приведен простой способ работы со строками символов.
Копировать (назначить новую строку):
strcpy(members, "hello");
Объединить (добавить строку):
strcat(members, " world");
Пустая строка:
members[0] = 0;
Вот так просто.
Заявление об ограничении ответственности: Обычно я не программирую на 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");