2015-12-10 2 views
1

У меня есть структура с массивом символов внутри него, однако я не могу найти достойный способ ее инициализации, если строка становится длиннее.Инициализировать массивы символов из строкового литерала

struct T 
{ 
    char id[4]; 
}; 

T t{ 'a','b', 'c','d'}; // case 1: OK 

T t{"abcd"}; // case 2: ERROR, "abcd" size is 5, too long for id 

Я получаю ниже ошибки:

error: initializer-string for array of chars is too long [-fpermissive] 
    T t{"abcd"}; 

Причина заключается в том, что строка "ABCD" содержит нуль-терминатор, поэтому размер 5.

Этот синтаксис разрешен C99 string literals, как может Я работаю в C++ 11?

+1

Возможно временное решение взять строку ac в конструкторе и скопировать 4 символа из него, но будьте осторожны, если он меньше. –

+0

@NeilKirk извините, забыл упомянуть, что тип T является третьей стороной lib, я не могу это изменить. – billz

+0

Звучит не очень качественная сторонняя библиотека, или, может быть, вы просто что-то пропустили в API. Если это действительно так плохо, почему бы не извлечь из него свой собственный класс, чтобы вы могли добавить все «приятные» вещи, которые вы хотите использовать для интерфейса? –

ответ

3

Вам не повезло. Если вы не можете изменить T, тогда нет обходного пути, если вы не откажетесь от прямой инициализации. Вам нужно будет использовать T t{'a', 'b', 'c'}; и т. Д. Это связано с тем, что T является агрегатом, поэтому единственной формой инициализации является передача фактических инициализаторов для каждого элемента.

Конечно, вы можете написать функцию, например .:

T t = T_from_literal("abcdefgh..."); 

, где эта функция использует std::copy или подобное, чтобы скопировать символы в T t; и возвращается по значению, пользуясь копией элизии.

0

Вы можете возражаете '\0' символ в конце строки при инициализации, так что вы всегда должны сделать еще один символ, чтобы заставить его работать:

struct T 
{ 
    char id[5]; 
}; 

Смотрите эту example

Смежные вопросы