2014-09-17 21 views
7

Tôi không chắc chắn mã hoạt động như thế nào. Tôi nghĩ bạn phải làm {'h', 'e' ...etc...} nhưng có vẻ như nó hoạt động tốt. Mặt khác, nếu bạn thực hiện std::array<const char*, nó chỉ thêm một phần tử vào mảng. Có quy tắc đặc biệt nào cho việc khởi tạo chuỗi ký tự không?Làm thế nào để std :: array initializer làm việc cho char's?

std::array<char, strlen("hello world!") + 1> s = {"hello world!"}; 
for (size_t i = 0; i < s.size(); ++i) 
{ 
    std::cout << s[i]; 
} 

Trả lời

4

Lớp std::array là tổng hợp. Trong tuyên bố này:

std::array<char, strlen("hello world!") + 1> s = {"hello world!"}; 

khởi tạo danh sách được sử dụng. Là phần tử đầu tiên và duy nhất của sự khởi tạo này của lớp std::array là một mảng ký tự, nó có thể được khởi tạo với các chuỗi ký tự chuỗi.

Nó sẽ là một cách chính xác hơn để sử dụng sizeof điều hành thay vì chức năng strlen:

std::array<char, sizeof("hello world!")> s = {"hello world!"}; 

Ngoài ra bạn có thể viết

std::array<char, sizeof("hello world!")> s = { { "hello world!" } }; 

vì mảng nhân vật lần lượt là một tổng thể.

Theo C++ chuẩn

8.5.2 mảng nhân vật [dcl.init.string]

1 Một mảng của kiểu hẹp ký tự (3.9.1), mảng char16_t, char32_t mảng , hoặc mảng wchar_t có thể được khởi tạo bằng một chuỗi ký tự hẹp, theo thứ tự chữ thường, chuỗi ký tự char32_t, chuỗi ký tự char32_t, hoặc chuỗi rộng theo thứ tự, hoặc bằng một chuỗi ký tự được đánh số thích hợp được đặt trong dấu ngoặc nhọn (2.14.5). Ký tự kế tiếp của giá trị của các chuỗi ký tự bắt đầu bằng chữ cái các phần tử của mảng.

[Ví dụ: char msg [] = "Lỗi cú pháp trên dòng% s \ n";

0

Dưới đây là một cách để đạt được điều này

// GOAL 
std::array<char, sizeof("Hello")> myarray = {"Hello"}; 

tức. khởi std :: mảng với một chuỗi chữ (có, nó được sử dụng một macro)

// SOLUTION 
#define STD_CHAR_ARRAY_INIT(arrayname, string_literal) /*std::array*/<char, sizeof(string_literal)> arrayname = {string_literal} 
std::array STD_CHAR_ARRAY_INIT(myarray, "Hello"); 

Dưới đây là một số mã kiểm tra:

#include <iostream> 
#include <array> 

using std::cout; 
using std::ostream; 

template<typename T, size_t N> 
std::ostream& std::operator<<(std::ostream& os, array<T, N> arr) 
{ 
    { 
    size_t cnt = 0; 
    char strchar[2] = "x"; 
    for (const T& c : arr) { 
     strchar[0] = c; 
     os << "arr[" << cnt << "] = '" << (c == '\0' ? "\\0" : strchar /*string(1, c)*/ ) << "'\n" 
     << '.' << c << '.' << '\n'; 
     ++cnt; 
    } 
    } 
    return os; 
} 


#define STD_CHAR_ARRAY_INIT(arrayname, string_literal) /*std::array*/<char, sizeof(string_literal)> arrayname = {string_literal} 

int main() 
{ 
    std::array STD_CHAR_ARRAY_INIT(myarray, "Hello"); 
    cout << myarray << '\n'; 
    return 0; 
} 
Các vấn đề liên quan