0

所以我现在正在尝试学习 C,并且我有一些基本的结构问题想要解决:

基本上,一切都围绕着这段代码:

#include <stdio.h>
#include <stdlib.h>

#define MAX_NAME_LEN 127

typedef struct {
    char name[MAX_NAME_LEN + 1];
    unsigned long sid;
} Student;

/* return the name of student s */
const char* getName (const Student* s) { // the parameter 's' is a pointer to a Student struct
    return s->name; // returns the 'name' member of a Student struct
}

/* set the name of student s
If name is too long, cut off characters after the maximum number of characters allowed.
*/
void setName(Student* s, const char* name) { // 's' is a pointer to a Student struct |     'name' is a pointer to the first element of a char array (repres. a string)
    s->name = name;
}

/* return the SID of student s */
unsigned long getStudentID(const Student* s) { // 's' is a pointer to a Student struct
    return s->sid;
}

/* set the SID of student s */
void setStudentID(Student* s, unsigned long sid) { // 's' is a pointer to a Student struct | 'sid' is a 'long' representing the desired SID
    s->sid = sid;
}

我已经对代码进行了注释,以巩固我对指针的理解;我希望他们都是准确的。

所以无论如何,我觉得 setName 和 setStudentID 不正确,但我不确定为什么。有人可以解释吗?谢谢!

编辑:

 char temp
 int i;
 for (i = 0, temp = &name; temp != '\0'; temp++, i++) {
     *((s->name) + i) = temp;
4

3 回答 3

5

你不是用这个复制全名数组

void setName(Student* s, const char* name) { 
   s->name = name;
}

试试这个

strcpy(s->name,name);

将此字符串复制到您的结构数组。您不能像当前那样简单地将指针参数分配给数组变量。您需要将指向的每个字符复制到name数组的元素中s->name。这就是strcpy将要执行的操作 - 它将元素从源复制到目标,直到找到终止的空字符。

编辑:或者,您可以strncpy按照评论中的建议使用。检查这个问题及其答案,看看为什么有些人认为这是个好主意为什么你应该使用 strncpy 而不是 strcpy?

于 2012-09-09T09:36:33.677 回答
3
s->name = name;

因为s->name是一个数组,所以你不能分配给它(它不是一个可修改的左值)——它应该是一个编译器错误。您将不得不strcpymemcpy进入它,但请确保name不要太大。

于 2012-09-09T09:35:41.610 回答
1

setStudentID 非常好,但 setStudentName 不是。您正在尝试将 char* 分配给数组,但这是行不通的。您必须使用一个按元素复制它的函数,例如strcpy

于 2012-09-09T09:36:43.213 回答