这是我的代码。我一直在努力解决为什么strncpy()
无法将字符串复制到struct
,因为它在我之前的作业中完美无缺。另外,我有第二个问题:假设我有一个包含另一个结构的结构,如何将值赋给内部结构:
struct _field {
char fieldName[50];
char fieldType[50];
int fieldLength;
};
struct _table {
char *tableFileName;
int reclen;
int fieldcount;
struct _field fields[100];
};
typedef enum { false, true } bool;
bool loadSchema(struct _table *table) {
printf("%s\n", "*** LOG: Loading table fields...");
FILE *fp = NULL;
char lines[1000];
char s[2] = " ";
fp = fopen("in.txt", "r+");
while (fgets(lines, sizeof(lines), fp) != NULL) {
char *token;
token = strtok(lines, s);
if (token != NULL) {
if (strcmp(token, "CREATETABLE") == 0) {
token = strtok(NULL, s);
if (token != NULL) {
token[strlen(token)-1] = '\0';
strcat(token, ".bin");
//table->tableFileName = token; // this line can write the value into struct
strncpy(table->tableFileName, token, 20);// this line cant write the value into struct
}
printf("*** LOG: Table name is [%s]\n", table->tableFileName);
}
/*if (strcmp(token, "ADD") == 0) {
token = strtok(NULL, s);
if (token != NULL) {
strncpy((*table).fields. fieldName, token, 50);
}// Q2: how to give a value into a struct of a struct?
}*/
}
}
return 1;
}
输入文件如下所示:
CREATETABLE people
ADD id char 50
ADD lname char 50
答案 0 :(得分:0)
问题1:您正在尝试复制到没有分配空间的字符串中。 table-> tableFilename只是一个指针。您需要动态分配空间或声明数组的固定宽度。
赋值表 - > tableFilename = token可以正常工作,因为它只是将指针指定为vaule,它不会尝试将数据复制到未分配的空间。
问题2:在声明表中 - > _fields是一个数组,因此您需要索引特定实例以为其成员分配值。例如。表 - >字段[0] .fieldName
答案 1 :(得分:0)
您正在获取分段错误,因为在您尝试访问指针表的代码中,它们没有分配内存,因此它指向null。因此崩溃。 该问题的解决方案是复制这些行
table = (struct _table*)(malloc (sizeof(struct _table)));
table->tableFileName = (char *)(malloc (sizeof(char) * 20));
strncpy(table->tableFileName, token, 20);
并记得释放他们。 回答你的第二个问题你只需要直接分配值 outer_struct.innerstruct.field1 = value outer_struct.innerstruct.field2 = value
或者如果内部结构是指针,则需要先为其初始化内存,然后您可以指定或直接使用memcpy。