Как инициализировать массив символов из указателя в C ++? - PullRequest
0 голосов
/ 30 января 2020

Я хочу инициализировать локальный char array с string, который сгенерирован в постоянный указатель c. В основном это выглядит так:

static const char * const FOO = "foo"; /* generated */
char bar[12] = FOO;                    /* my code */

Компилятор не принимает его:

error: array must be initialized with a brace-enclosed initializer

Какую конструкцию я могу использовать для инициализации бара char array с указанием string FOO?

Контекст : в моей компании мы пишем модульные тестеры для кода C с использованием фреймворка C ++. Поэтому параметр bar должен быть массивом и не может быть строковым типом C ++. Константа FOO генерируется из проприетарного IDL. Генератор кода генерирует #define для C кода, но статический const char * const для C ++.

Ответы [ 4 ]

3 голосов
/ 30 января 2020

Вы не можете инициализировать массив указателем. Но вы можете скопировать строку после инициализации массива по умолчанию.

в моей компании мы пишем тестеры модулей для кода C с использованием фреймворка C ++. Поэтому параметр bar должен быть массивом и не может быть строковым типом C ++.

Я не понимаю твоих рассуждений. Это похоже на ошибочное предположение.

2 голосов
/ 30 января 2020

Я ожидаю, что сработает следующее:

static const char * const FOO = "foo"; /* generated */
char bar[12], *pBar = strcpy(bar, FOO);                    /* my code */

, и тогда вы сможете получить к нему доступ через bar[] или через pBar.

Существует избыточность дополнительного char * но, возможно, это не имеет значения.

Вы можете даже рассмотреть что-то вроде следующего, чтобы защититься от переполнения буфера:

static const char * const FOO = "foo"; /* generated */
char bar[12] = {0}, *pBar = strncpy(bar, FOO, sizeof(bar)/sizeof(bar[0]) - 1);                    /* my code */

Вы также можете рассмотреть обертывание этого в #define как:

#define MAKEARRAY(name, size, thing) char name[size] = {0}, *p##name = strncpy(name, (thing), (size) - 1)

, а затем использовать его как:

MAKEARRAY(bar2, 14, FOO);
0 голосов
/ 30 января 2020

Это не идеально, но должно дать вам представление. Он использует локальные переменные, чтобы они не сохранялись за пределами этих функций. Я не уверен, что вы использовали Stati c так, как вы думали, его следует использовать. Я бы рекомендовал НЕ помещать его в функцию, так как вы не можете получить к нему доступ вне функции, но он останется в памяти.

void ModifyString(char* data, int length)
{
    std::cout << "Data: " << data << ", Length: " << length;
}

void ModifyString(const char* data)
{
    char buffer[256];
    int length = -1;
    while (data[++length])
        buffer[length] = data[length];
    buffer[length] = 0;
    ModifyString(buffer, length);
}

int main() 
{
    ModifyString("Hello Test");
    return 0;
}
0 голосов
/ 30 января 2020

Это работает, но ИМХО выглядит некрасиво:

static const char *const X = "abc";
char x[12] = { X[0], X[1], X[2], X[3] };

Определения будут работать:

#define X "abc"
char x[12] = X;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...