2014-01-12 3 views
1

Я новичок в программировании на C, но имею опыт работы на других языках.structs, указатели и их изменение

В настоящее время я изучаю структуры и указатели. Мое задание состоит в том, чтобы отсортировать несколько имен с помощью структур и указателей.

Я начал с создания структуры и функции для замены 2 имен. Я просто не могу понять, что пойдет не так, когда я хочу объявить массив со структурой.

Это ошибка я получаю, когда я компилирую:

pr.c:29:22: error: expected expression 
     studenten[i]={s[i][0],s[i][1],s[i][2]}; 
       ^
1 error generated. 

Вот код:

#include <stdio.h> 
#define MAXSTUDENT 2 

typedef struct { 
    char *firstname; 
    char *pre; 
    char *lastname; 
} student; 

void swap(student **a,student **b) { 
    student *temp; 
    temp=*a; 
    *a=*b; 
    *b=temp; 
} 


int main() { 
    int i; 
    char *s[MAXSTUDENT][3]={{"John"," the ","Way"},{"John"," ","Smith"}}; 
    student *studenten[MAXSTUDENT]; 

    for (i=0;i<MAXSTUDENT;i++) { 
     studenten[i]={s[i][0],s[i][1],s[i][2]}; 
    } 


    printf("%s%s%s -  %s%s%s\n",studenten[0]->firstname,studenten[0]->pre,studenten[0]->lastname,studenten[1]->firstname,studenten[1]->pre,studenten[1]->lastname); 
    swap(&studenten[0],&studenten[1]); 
    printf("%s%s%s -  %s%s%s\n",studenten[0]->firstname,studenten[0]->pre,studenten[0]->lastname,studenten[1]->firstname,studenten[1]->pre,studenten[1]->lastname); 
} 
+1

В чем проблема? Вы получаете сообщение об ошибке? Если да, то где? –

+0

добавлен в вопрос, спасибо – RG337

+0

http://www.cplusplus.com/reference/cstring/strcpy/ –

ответ

3

Это не работает так, как вы ожидаете:

studenten[i] = {s[i][0],s[i][1],s[i][2]}; 

Списки инициализаторов членов действительны только в объявлении, регулярные присваивания не могут использовать списки инициализаторов. Вам придется делать это вручную, а также выделить память себя:

for (i=0;i<MAXSTUDENT;i++) { 
    studenten[i] = malloc(sizeof(*studenten[i])); 
    if (studenten[i] == NULL) { 
     /* Handle malloc error... */ 
    } 
    studenten[i]->firstname = s[i][0]; 
    studenten[i]->pre = s[i][1]; 
    studenten[i]->lastname = s[i][2]; 
} 

В любом случае, обратите внимание, что s[i][j] является 0 для любого i, большего или равного 2 - вы только инициализируетесь s[0] и s[1].

+0

Я больше не получаю компиляцию, но я получаю ошибку шины (10) во время выполнения – RG337

+0

http://stackoverflow.com/questions/212466/what-is-a-bus-error –

+0

Учитывая, что 'swap' принимает 'student **' type, передача адресов указателей ученика должна по-прежнему работать правильно? –

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