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

标签 c arrays struct

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

我在 callInitialize 中创建了一个指针“L”并将其设置为我命名为“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 并尝试设置要测试的值,但这是不正确的。

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';

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

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

关于更改包含结构打印的数组的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7617338/

相关文章:

c - 对于数组,为什么 a[5] == 5[a]?

c++ - 在 OpenGL 中绘制形状的标准(常见)方法是什么?

javascript - JavaScript中的数组遍历填充两个 map

java - 一维ArrayList基本统计计算器

c - 当将输入从文件扫描到结构,然后保存更改时,为什么它总是写入第一行并删除其他所有内容?

c# - 将 C++ 结构转换为 C# 以用于 UDP 通信

c - 使用 malloc 时如何正确使用 free() 来释放内存?

c - 参数中的数组没有变量初始化

ios - 为什么不是所有项目都附加到数组中?

c++ - if 语句内满足的条件的索引