2011-10-01 57 views
1

我想从数组项中访问名称字段并打印名称,但我遇到了问题。更改包含结构打印的阵列的值

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

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并尝试设置要测试的值,但这是不正确的。

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

我不确定为什么L-> items [0] .name = test;是不合适的。我得到不兼容的类型错误,但名称是字符和测试是字符?

另外,一旦我改变了那个值,我会如何打印呢?我的想法是%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; 

感谢您的任何帮助。

回答

3

C中的字符串复制不能像那样工作。字符串只是简单的字符数组,空字符作为最后一个元素;因此要复制一个字符串,您需要将源数组中的单个字符复制到目标数组中的相应元素。有这样做的库函数,如strncpy()

所以,你需要改变:

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

..to类似:

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

..where第二行只是确保有在最后一个空字符,万一testMAXNAMESIZE长。

如果Studentname成员已被宣布为char *malloc()分配的,而不是声明的char数组,赋值会工作,但可能不会完成你想要的东西 - 它会改变name指向与test(不是其副本)相同的字符串,并丢弃原始值,泄漏malloc() ed内存。

+0

['strncpy'不一定是空终止你的字符串!](http://stackoverflow.com/questions/1453876/why-does-strncpy-not-null-terminate) –

+0

@AdamRosenfield这就是为什么明确的答案null在'strncpy'之后终止它 – Dmitri