2012-04-30 45 views
6

Tôi muốn có chuỗi ký tự kết thúc NULL ('\ 0') với ký tự rỗng là 0 ('\ 0').khởi tạo mảng char với dấu cách

Hiện nay tôi đang làm việc đó ở sau cách

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

foo[num_space_req] = '\0'; 

Có cách nào tốt hơn cho ở trên?

+5

'std :: điền (foo, foo + num_space_req, '');' – chris

+4

Hãy cố gắng tránh gắn thẻ câu hỏi với cả C và C++ trừ khi bạn _really_ cần một giải pháp đa ngôn ngữ. Họ là _vastly_ ngôn ngữ khác nhau một khi bạn loại bỏ tất cả các công cụ C di sản C++ lập trình không nên sử dụng anyway :-) – paxdiablo

+0

Bạn đã nhận được rất nhiều câu trả lời tốt. Bạn có thể muốn chấp nhận một trong số họ. – octopusgrabbus

Trả lời

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

Bạn có thể sử dụng sau đây để khởi tạo mảng để không gian:

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

Downvoter: chăm sóc bình luận? –

+0

Tôi đã không downvote, nhưng bằng cách sử dụng memset sẽ không là sự lựa chọn đầu tiên của tôi. – bames53

+0

@ bames53: Cho rằng câu hỏi này được gắn thẻ (trong số những thứ khác) là C, bạn sẽ chọn gì? –

0

memset có thể được tối ưu hóa tốt hơn cho vòng lặp, nó có thể là giống hệt nhau. chọn một trong số:

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

Kể từ khi câu hỏi có một ++ thẻ C, cách thành ngữ sẽ là:

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

Lưu ý rằng nó không hoạt động trong C.

+0

gọi tốt mang trong thành ngữ C++, nhưng không phải là câu trả lời này không đầy đủ ở chỗ nó không đặt một terminator null? – feuGene

1

Như @OliCharlesworth đã nói, cách tốt nhất là sử dụng memset:

char bla[20]; 

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

Lưu ý rằng trong GNU C, bạn cũng có thể sử dụng tiện ích sau (khoảng initializers định):

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

Nếu bạn muốn các mảng được khởi tạo vào thời điểm biên dịch, bạn có thể sửa đổi tuyên bố char foo[20]; của bạn như sau:

char foo[20] = {0x20};

Nếu bạn cần phải khởi tạo mảng không gian tại thời gian chạy, sau đó bạn có thể sử dụng như sau:

memset(foo, ' ', sizeof(foo) -1); 
foo[20] = '\0'; 
Các vấn đề liên quan