Lilyanaa Ответов: 4

Инициализация массива в struct в C


Привет, я пытаюсь инициализировать массив char и int в этом простом коде, но у меня есть ошибка ,
n.c:25:19: error: expected expression before ‘]’ token
   select.arr1[]={
                   ^
n.c:31:18: error: expected expression before ‘]’ token
  select.num1[]={
                  ^
n.c:36:17: error: expected expression before ‘]’ token
 select.arr2[]={
                 ^
n.c:41:18: error: expected expression before ‘]’ token
  select.num2[]={


как вы можете решить эту проблему, пожалуйста ?

Что я уже пробовал:

int main( void )
{
   
 struct str 
  {
   char arr1[4],arr2[4];
   int num1[4],num2[4];

 
} ;
struct str select ;

  select.arr1[]={
    { .arr1 = "lely" },
    { .arr1 = "sara" }
    
};

 select.num1[]={
    { .num1=30 },
    { .num1=70 }
    
};
select.arr2[]={
    { .arr2 = "sam" },
    { .arr2 = "denis" }
    
};
 select.num2[]={
    { .num2=50 },
    { .num2=90 }
    
};

printf("%s",select.arr1[0]);
printf("%s",select.arr1[1]);
printf("%d",select.num1[0]);
printf("%s",select.arr2[0]);


}

Lilyanaa

да,я видел это , но эта ссылка использует массив структуры

Dave Kreskowiak

Ваш код не имеет никакого смысла вообще, и вы описали, что вы пытаетесь сделать.

Похоже, это домашнее задание, поэтому я не собираюсь давать вам то, что, как я подозреваю, должно быть ответом. Если то, что я думаю, правда, то с этим кодом много чего не так.

Lilyanaa

Нет,это не домашнее задание, и в этом коде я пытаюсь придать постоянное значение членам struct. спасибо

4 Ответов

Рейтинг:
2

KarstenK

Вы совершенно неправильно понимаете структуру данных структуры. В нем есть только те члены, которых вы выделяете.

struct str 
{
   char arr1[4],arr2[4]; //both member have 4 chars (no char*)
   int num1[4],num2[4];  //both member have 4 integers
};
//this may work (I dont use that syntax
select = {
    { .arr1 = "lely" },
    { .arr2 = "sara" }
};
Я бы написал простой код (или написал функцию сеттера)
memset( &select, sizeof(select), 0 );// clear full struct
strncpy( select.arr1, 4, "lely" );

select.num[0] = 30;//access first field of array
select.num[1] = 50;//access secondfield of array
Используйте отладчик, чтобы увидеть, как изменяются данные в вашей структуре.

Вы должны сначала изучить основы. Связанный учебник отлично подходит для этого.

Совет: используйте лучшие имена для кода, чтобы лучше понять его.


Рейтинг:
2

Dave Kreskowiak

много проблем.

1) Вы определяете структуру внутри вашего основного метода. Это сделает любой экземпляр этой структуры только возможным и видимым только внутри основного метода.

2) эти массивы символов будут содержать только 4 символа, а не 5 и 6 символьных строк, которые вы имеете в своих "инициализаторах". Да, в конце каждой строки символов есть еще один невидимый нулевой символ.

3) у вас есть массивы для целых чисел, но это не похоже на то, что вы действительно пытаетесь сделать. Похоже, вы пытаетесь создать массив экземпляров структуры. Вы не помещаете массивы внутри структуры. Вместо этого вы создадите массив структур, каждая из которых будет иметь две строки по 3 символа или меньше и два целых значения.

4) отпечатки в конце кода, вероятно, будут отображать то, что вы не собираетесь делать. Вы, кажется, либо хотите отдельные строки, но вы получаете частичные строки.

5) в ваших "инициализаторах" вы не можете ссылаться на имена переменных. Значения, которые вы предоставляете, должны охватывать все поля и предоставляться в том порядке, в котором они отображаются в структуре:

str select2 = {
    "lely", "sara", { 30, 70, 20, 10 }, { 1, 2, 3, 4 }
};


6) Когда вы используете struct ключевое слово, вы определяете новую структуру. Ваш struct str select это очень плохая попытка переопределить структуру str.

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


Рейтинг:
1

Rick York

Вот как инициализировать структуру :

struct str
{
   char arr1[4];   // this string is limited to three characters plus null
   char arr2[4];
   int  num1[4];
   int  num2[4];
};

struct str select =
{
    "Sam",
    "Joe",
    { 0, 1, 2, 3 },
    { 4, 5, 6, 7 }
};
Ключевые вещи-массивы символов могут быть инициализированы как явный массив, например целые числа, или как строка, как я сделал выше.


Lilyanaa

Большое вам спасибо, но если у меня есть 3 строки в arr1 [], я знаю, что это должно быть define arr1[numofstring][stringlen], но как я могу дать ему инициализацию ?

Рейтинг:
0

Rick York

Вот как инициализировать структуру :

struct str
{
   char arr1[4];   // this string is limited to three characters plus null
   char arr2[4];
   int  num1[4];
   int  num2[4];
};

struct str select =
{
    { 'S', 'a', 'm', 0 },   // or it could have been "Sam",
    { 'J', 'o', 'e', 0 },   // or it could have been "Joe",
    { 0, 1, 2, 3 },
    { 4, 5, 6, 7 }
};
Ключевые вещи-массивы символов могут быть инициализированы как явный массив, например целые числа, или как строка.


[no name]

Похоже на случайный двойной пост, из-за недавних проблем со связью.