Как инициализировать все члены массива массивов символов в одну строку по умолчанию? - PullRequest
0 голосов
/ 29 февраля 2020

Я хочу инициализировать все члены массива char массивов одной строкой по умолчанию "default".

. У меня есть либо:

char a[10][8];

for(int i = 0; i < 10; i++)
{ 
    strcpy(&a[i][0],"default"); 
}

, либо альтернативно :

char a[10][8] = { 
                  {"default"}, {"default"}, {"default"}, {"default"}, {"default"}, 
                  {"default"}, {"default"}, {"default"}, {"default"}, {"default"}
                };

Есть ли способ в синтаксисе C, чтобы сократить это более простым способом?


Я знаю, что есть аналогичный вопрос Как инициализировать все члены массива одним и тем же значением? , но ответы там сосредоточены на том, как инициализировать одномерный массив int со значениями int, а не двумерный массив char со строками.

1 Ответ

2 голосов
/ 29 февраля 2020

Один из ответов на ваш связанный вопрос показывает единственный (определенный компилятором c) способ, которым я знаю, чтобы сократить инициализацию:

char a[10][8] = { [0 ... 9] = {"default"} };

Это расширение G CC, задокументированное под обозначенными инициализаторами .

Обратите внимание, что пробел перед нотацией ... является обязательным; в противном случае у вас есть литерал с плавающей точкой 0. (из-за правила 'maximal munch'), который нельзя использовать в качестве нижнего индекса. Пространство после этого симметрично c, хотя не является строго необходимым. (Я удивлен, что они не выбрали что-то вроде двоеточия : для разделения чисел - не было бы никакой опасности путаницы, поскольку единственные другие точки, которые появляются в двоеточиях, - после меток или в троичном операторе ?:, которые здесь явно не актуальны. Я также разочарован тем, что подобное не было добавлено в C99 - или позже - как часть назначенной функции инициализаторов. В конце концов, в Fortran 66 (он же Fortran IV) был механизм для повторения «инициализаторов» !)

...