2012-04-30 2 views
6

Voglio una stringa di terminazione NULL ('\ 0') di 20 caratteri riempita con spazi bianchi.inizializzazione del char array con spazi

Attualmente mi sto facendo in modo seguente

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

foo[num_space_req] = '\0'; 

Esiste un modo migliore per la di cui sopra?

+5

'std :: riempimento (foo, foo + num_space_req, ' ');' – chris

+4

favore cercate di evitare domande di tagging sia con C e C++ a meno che non _really_ bisogno di una soluzione cross-language. Sono _vastamente_ diverse lingue una volta rimosse tutte le cose legacy di cui i codificatori C++ non dovrebbero usare comunque :-) – paxdiablo

+0

Hai ricevuto molte buone risposte. Potresti voler accettare uno di loro. – octopusgrabbus

risposta

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

È possibile utilizzare il seguente per inizializzare l'array di spazi:

memset(foo, ' ', num_space_req); 
foo[num_space_req] = '\0'; 
+1

Downvoter: cura di commentare? –

+0

Non ho fatto down, ma usare memset non sarebbe stata la mia prima scelta. – bames53

+0

@ bames53: Dato che questa domanda è contrassegnata (tra le altre cose) come C, quale sceglieresti? –

0

memset potrebbe essere meglio ottimizzato del tuo ciclo for, potrebbe essere esattamente lo stesso. scegliere uno dei:

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

Poiché la questione ha un tag C++, il modo in cui sarebbe idiomatica:

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

Si noti che non funziona in C.

+0

una buona chiamata che introduce l'idioma C++, ma questa risposta non è incompleta in quanto non pone un terminatore nullo? – feuGene

1

Come ha detto @OliCharlesworth, il modo migliore è utilizzare memset:

char bla[20]; 

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

Si noti che in GNU C, è anche possibile utilizzare la seguente estensione (range inizializzatori designati):

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

Se si desidera che l'array inizializzato in fase di compilazione, è possibile modificare la dichiarazione char foo[20]; come segue:

char foo[20] = {0x20};

Se è necessario inizializzare l'array di spazi in fase di esecuzione, quindi è possibile utilizzare il seguente:

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