Инициализация и объявление массива символов в C

Это работает.

char s[] = {'\x20', '\x09', '\x0a', '\x0d'};

Это не так, потому что «ошибка: ожидаемое выражение перед токеном ']' (или '}'):

char s[4];
s = {'\x20', '\x09', '\x0a', '\x0d'};

char s[4];
s[]= {'\x20', '\x09', '\x0a', '\x0d'};

char s[4];
s[4]= {'\x20', '\x09', '\x0a', '\x0d'};

Есть ли правильный способ определить и инициализировать две разные строки без использования индексов? Я знаю, что могу сказать:

char s[4];
s[0] = '\x20';
s[1] = '\x09';
s[2] = '\x0a';
s[3] = '\x0d';

Но из любопытства, я упускаю что-то тривиальное или это неизбежно в C?


person Jeremy Rosenberg    schedule 03.02.2015    source источник
comment
Вопрос в том, зачем вам нужно делать это на двух разных строках?   -  person Lundin    schedule 03.02.2015
comment
Определение структуры, а затем ее использование.   -  person Jeremy Rosenberg    schedule 03.02.2015
comment
Здесь нет структуры. Это массивы символов.   -  person Lundin    schedule 03.02.2015
comment
Структуры и массивы инициализируются по-разному, по разным наборам правил. Кроме того, определения типов обычно используются вместе со структурами, но не с массивами.   -  person Lundin    schedule 03.02.2015
comment
Мой вопрос касается основной проблемы моего непонимания. Это было упрощено, чтобы ориентироваться на это. Ответ на этот вопрос научил меня, как я могу определить массив символов в структуре, а затем инициализировать его в другом месте моего кода, где создается моя структура.   -  person Jeremy Rosenberg    schedule 03.02.2015


Ответы (3)


char s[] = {'\x20', '\x09', '\x0a', '\x0d'};

Как вы видите, размер массива не указан, поэтому вам нужно иметь здесь инициализатор, и на основе инициализатора размер массива вычисляется и сохраняется в стеке.

Даже если у вас есть

char s[4];

s = {'1','2','3','4'};

Это не сработает, потому что в стандарте C сказано, что массивы не могут быть назначены.

Если вам нужно инициализировать, сделайте это во время объявления, поскольку вы уже делаете это, иначе заполните массив char за char или используйте встроенные функции, такие как strcpy()

person Gopi    schedule 03.02.2015
comment
Спасибо за помощь. - person Jeremy Rosenberg; 03.02.2015
comment
Это также не сработает, потому что {1,2,3,4} не является выражением. Если бы у вас было typedef struct {char a,b,c,d;} char4;, вы могли бы сделать char4 c; c = (char4){1,2,3,4}; - person rici; 03.02.2015
comment
@rici Да, здесь есть новый тип с typedef, но имя массива не может быть назначаемым lvalue - person Gopi; 03.02.2015
comment
@JeremyRosenberg без проблем - person Gopi; 03.02.2015
comment
@Гопи; Я знаю. Я хочу сказать, что вам нужно явное приведение (char4) перед выражением фигурной скобки, чтобы использовать фигурный литерал. В С99/11. Я мог бы сделать структуру из массива -- typedef struct {char a[4];} char4;, но тогда gcc/clang будет раздражающе ныть об отсутствии фигурных скобок, настаивая на char4 c; c = (char4){{1,2,3,4}}; - person rici; 03.02.2015

вы не можете назначать так без индекса после объявления.

Таким образом, вы можете назначить это, используя комбинацию strcpy и strcat.

Для первого вы можете использовать strcpy, затем strcat.

strcpy(s,"\x20");
strcat(s,"\x09");
strcat(s,"\x0a");
strcat(s,"\x0d");

Или же используйте strcpy для копирования всего контента за один раз.

person Karthikeyan.R.S    schedule 03.02.2015
comment
Спасибо за вашу помощь, @Gopi ответил так же раньше вас. - person Jeremy Rosenberg; 03.02.2015

person    schedule
comment
Спасибо, другие отвечали аналогично, но вы показали точный код. - person Jeremy Rosenberg; 03.02.2015