как инициализировать массив символов? - PullRequest
36 голосов
/ 28 июня 2010
char * msg = new char[65546];

хочу инициализировать до 0 для всех из них. Каков наилучший способ сделать это в C ++?

Ответы [ 8 ]

59 голосов
/ 28 июня 2010
char * msg = new char[65546]();

Он известен как инициализация значения и был представлен в C ++ 03.Если вы оказались в ловушке в предыдущем десятилетии, вам нужно будет использовать std::fill() (или memset(), если вы хотите притвориться, что это C).

Обратите внимание, что это не будет работать для любого значения, кроме нуля.Я думаю, что C ++ 0x предложит способ сделать это, но я немного отстал, поэтому я не могу комментировать это.

ОБНОВЛЕНИЕ: кажется, мои размышления о прошлом и будущемязык не совсем точен;см. комментарии для исправлений.

16 голосов
/ 28 июня 2010

"Наиболее C ++" способ сделать это - использовать std::fill.

std::fill(msg, msg + 65546, 0);
15 голосов
/ 28 июня 2010

В отсутствие действительно веской причины поступить иначе, я бы, вероятно, использовал:

std::vector<char> msg(65546, '\0');
9 голосов
/ 28 июня 2010

Каков наилучший способ сделать это в C ++?

Потому что вы спросили это так:

std::string msg(65546, 0); // all characters will be set to 0

Или:

std::vector<char> msg(65546); // all characters will be initialized to 0

Если вы работаете с функциями C, которые принимают char * или const char *, то вы можете сделать:

some_c_function(&msg[0]);

Вы также можете использовать метод c_str () в std :: string, если он принимаетconst char * или data ().

Преимущество этого подхода состоит в том, что вы можете делать все, что хотите, с динамически выделяемым буфером символов, но более безопасно, гибко, а иногда даже более эффективно (избегая необходимостипересчитать длину строки линейно, например).Более того, вам не нужно освобождать память, выделенную вручную, поскольку деструктор сделает это за вас.

6 голосов
/ 28 июня 2010

Этот метод использует функцию 'C' memset и является очень быстрым (избегает цикла char-by-char).

const uint size = 65546;
char* msg = new char[size];
memset(reinterpret_cast<void*>(msg), 0, size);
5 голосов
/ 28 июня 2010
memset(msg, 0, 65546)
1 голос
/ 28 декабря 2016

C-подобный метод может быть не таким привлекательным, как другие решения этого вопроса, но для полноты добавлен:

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

char msg[65536] = {0};

Или для использования нулей учитывайте следующее:

char msg[65536] = {'0' another 65535 of these separated by comma};

Но не пытайтесь сделать это, поскольку невозможно , поэтому используйте memset!

Во втором случае добавьте следующее после memset, если вы хотите использовать msg в качестве строки.

msg[65536 - 1] =  '\0'

Ответы на на этот вопрос также дают дополнительную информацию.

1 голос
/ 30 июня 2010

Вы можете использовать цикл for. но не забывайте, что последний символ должен быть нулевым символом!

char * msg = new char[65546];
for(int i=0;i<65545;i++)
{
    msg[i]='0';
}
msg[65545]='\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...