答案 0 :(得分:1)
您正在将每一行读入相同的字符串line
。然后,当您使用strtok()
时,它会将指针返回到此字符串中,并且您将这些指针存储到DB
中。因此DB
中的所有记录都指向line
中的位置,每次从文件中读取另一行时都会被覆盖。完成所有操作后,line
包含文件最后一行的内容,所有DB
条目都指向该内容。
另一个问题是line
是一个局部变量,当函数返回时,它的指针变为无效。
要解决这两个问题,您需要复制字符串并将其存储在DB
中。例如:
DB.user[rowC]= strdup(word);
这也意味着当您使用DB
记录完成后,您需要致电free(DB.user[i])
答案 1 :(得分:1)
一些建议:
首先,学习使用调试器。有 free ones ,得到一个并打开它以找到所有这些错误(这就是我在这里所做的)
接下来,对于您要编译的代码示例,struct定义需要支持您的代码(目前,DB未定义)
typedef struct
{
char *user[MAX_SIZE];
char *pass[MAX_SIZE];
char db[10][2];
}arrayDB;
arrayDB DB;//define DB
接下来,
您需要为字符串数组分配空间: 类似的东西:
for(i=0;i<MAX_SIZE;i++ )
{
DB.user[i] = malloc(100);
DB.pass[i] = malloc(100);
}
接下来,使用它们时不要忘记释放它们。
for(i=0;i<MAX_SIZE;i++ )
{
free(DB.user[i]);
free(DB.pass[i]);
}
接下来,您无法使用相等的运算符分配字符串:
DB.pass[rowC]=word;
使用strcpy(或其他一些字符串函数)代替:
strcpy(DB.pass[rowC],word);
接下来,这一行:
printf("r=%s , c=%s\n",DB.user[rowC],DB.pass[rowC]);
在条件语句之后调用,其中 <{em> DB.user[rowC]
或 DB.pass[rowC]
将被写入,而不是两者都写入。建议拆分此printf语句以打印其中一个,并将其放入适当的条件分支。