繁体   English   中英

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

[英]Changing values of an array containing a struct printing

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

我在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; 是不合适的。 我收到了不兼容的类型错误,但名称是char,而测试是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;

感谢您的任何帮助。

在C中进行字符串复制不能那样工作。 字符串只是字符数组,最后一个使用的字符为空。 因此,要复制字符串,您需要将单个字符从源数组复制到目标数组中的相应元素。 有一些库函数可以执行此操作,例如strncpy()

因此,您需要更改:

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

..像这样:

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

..其中第二行只是确保结尾处有一个空字符,以防万一testMAXNAMESIZE

如果Studentname成员已声明为char *并使用malloc()分配,而不是声明为char数组,则该分配会起作用,但可能未完成您想要的操作-它将name更改为指向与test相同的字符串(而不是它的副本),只是丢弃了原始值,从而泄漏了malloc() ed内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM