更改包含结构打印的数组的值

时间:2011-10-01 00:32:15

标签: c arrays struct

我想从数组项中访问名称字段并打印名称,但我遇到了麻烦。

我在callInitialize中创建了一个指针'L',并将其设置为上层结构类型List,我将其命名为'studentList'。

int callInitialize () {

/*Initialize a List*/
List studentList;
List *L;
L = &studentList;
Initialize(L);

#ifdef DEBUG
    printf("L->count after function call Initialize = %d\n", L->count);
    printf("L->items[0].name after function call Initialize = %s\n", studentList.items[0].name);
#endif 

return 0;
}

然后我调用了Initialize并尝试将值设置为test,但这是不正确的。

void Initialize (List *L) {
char test = "I like you";
L->count = 0;
L->items[0].name = test;
}

我不确定为什么L-> items [0] .name = test;不合适。我收到一个不兼容的类型错误,但名称是char,test是char?

另外,一旦我更改了该值,我将如何打印它?我的想法是%s是正确的,因为字段名称的类型是char。打印在callIntialize中作为调试语句。

我的结构声明:

#define MAXNAMESIZE 20
typedef struct {
char name[MAXNAMESIZE];
int grade;   
} Student;

typedef Student Item;
#define MAXLISTSIZE 4
typedef struct {
Item items[MAXLISTSIZE];
int count;
} List;

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

C中的字符串复制不起作用。字符串只是字符数组,使用空字符作为最后一个元素;因此,要复制字符串,您需要将源数组中的各个字符复制到目标数组中的相应元素。有用于执行此操作的库函数,例如strncpy()

所以你需要改变:

L->items[0].name = test;

......之类的:

strncpy(L->items[0].name,test,MAXNAMESIZE);
L->items[0].name[MAXNAMESIZE - 1] = '\0';

..第二行只是确保最后有一个空字符,以防test长于MAXNAMESIZE

如果name的{​​{1}}成员已被声明为Student且已分配char *,而不是声明为malloc()的数组,则赋值可能有效,但可能没有完成你想要的 - 它会改变char指向与name相同的字符串(不是它的副本)并且只丢弃原始值,泄漏test ed memory。