инициализация char массив с пробелами

Я хочу 20-символьный NULL (''), завершающий строку, заполненную пробелами.

В настоящее время я делаю это следующим образом

char foo[20];  
for (i = 0; i < num_space_req; i++)        //num_space_req < 20  
{  
    foo[i] = ' ';  
}

foo[num_space_req] = '';

есть ли лучший способ для выше?

8 ответов


std::string foo(num_space_req,' ');

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

memset(foo, ' ', num_space_req);
foo[num_space_req] = '';

поскольку вопрос имеет тег C++, идиоматическим способом будет:

std::fill(foo, foo + num_space_req, ' ');
// or
std::fill_n(foo, num_space_req, ' ');

обратите внимание, что он не работает в с.


Вы можете использовать memset для такого рода вещи.

memset (foo, ' ', num_space_req)

http://www.cplusplus.com/reference/clibrary/cstring/memset/


As @OliCharlesworth сказал, лучший способ-использовать memset:

char bla[20];

memset(bla, ' ', sizeof bla - 1);
bla[sizeof bla - 1] = '';

обратите внимание, что в GNU C вы также можете использовать следующее расширение (диапазон, обозначенный инициализаторами):

char bla[20] = {[0 ... 18] = ' ', [19] = ''};

Если вы хотите инициализировать массив во время компиляции, вы можете изменить свой char foo[20]; декларации следующим образом:

char foo[20] = {0x20};

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

memset(foo, ' ', sizeof(foo) -1);
foo[20] = '';

memset может быть лучше оптимизирован, чем ваш цикл for, он может быть точно таким же. выберите один из:

memset( foo, ' ', sizeof(foo) -1 );
memset( foo, ' ', 19 );
memset( foo, ' ', 19 * sizeof(char) );

#include <cstring>
void makespace(char *foo, size_t size) {
  memset((void*)&foo, ' ', size - 1);
  foo[size] = 0;
}
// ...
makespace(foo, 20);