从file.txt C编程读取其输入的字符串数组

时间:2016-01-29 20:16:20

标签: c arrays

我遇到了问题,无法说清楚它是什么。

CultureInvariant

但输出我得到的所有数组元素都是相同的值,这是文件中的最后一个单词 正如你在图片中看到的那样

enter image description here

感谢

2 个答案:

答案 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语句以打印其中一个,并将其放入适当的条件分支。