c - 结构、指针和改变它们

标签 c sorting pointers struct

我对 C 编程还很陌生,但对其他语言有一些经验。

我目前正在学习结构和指针。我的任务是使用结构和指针对一些名称进行排序。

我首先制作了一个结构和一个用于交换 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);
}

最佳答案

这并不像您期望的那样工作:

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] 对于任何大于或等于 2 的 i 都是 0 - 你只初始化了 s[0]s[1]

关于c - 结构、指针和改变它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21080171/

相关文章:

C11 相当于 POSIX flockfile()?

分离相同类型项目的算法

arrays - 我的搜索算法(类似于冒泡排序)的最佳和最坏情况运行时间?

C 函数退出时函数指针参数不相同

C - 将 execvp 与用户输入一起使用

c - 在 C 函数中声明的函数可以在全局范围内使用吗?

c - 查找字符串结尾 : *s++ VS *s then s++

c - Eclipse stdio.h 错误

javascript - 如何获得一致的数字排序结果?

c - 释放分配给 char* (由 `malloc` 分配)的 int* 是否会调用未定义的行为?