所以我现在正在努力学习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;
答案 0 :(得分:5)
您没有使用此
复制全名数组void setName(Student* s, const char* name) {
s->name = name;
}
试试这个
strcpy(s->name,name);
将此字符串复制到structs数组。你不能简单地将指针参数分配给你当前的数组变量。您需要将name
指向的每个字符复制到数组s->name
的元素中。这就是strcpy
将要执行的操作 - 它将元素从源复制到目标,直到找到终止空字符。
编辑:或者您可以按照评论中的建议使用strncpy
。查看此问题及其答案,了解为什么有些人认为这是一个好主意Why should you use strncpy instead of strcpy?
答案 1 :(得分:3)
s->name = name;
由于s->name
是一个数组,你不能分配它(它不是一个可修改的左值) - 它应该是一个编译器错误。您必须strcpy
或memcpy
,但请确保name
不是太大。
答案 2 :(得分:1)
setStudentID非常好,但setStudentName不是。您正在尝试将char *分配给数组,但这不起作用。你必须使用一个按元素复制它的函数,比如strcpy。