从文件中读取并存储到C中的2D数组中

时间:2016-09-30 16:47:41

标签: c arrays segmentation-fault

我在代码中设置了2个2D数组,一个用于存储ID数组,另一个用于存储密码。我试图从文本文件中读取格式为:

    ID1 PASSWORD1
    ID2 PASSWORD2
    ID3 PASSWORD3
    ID4 PASSWORD4
    ID5 PASSWORD5

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_RECORDS 100
#define MAX_INPUT 40

void readFile();
void inputInit();
void DBInit();
void init();


FILE *fp;

char **IDArray;
char **passwordArray;

char *IDInput;
char *passInput;

int main(){
    init();
    readFile();

    return 0;
}

void readFile(){
    fp = fopen("Database_Table.txt","r");

    char line[MAX_INPUT];
    if(fp == NULL){
        perror("Error in opening file");
    }
    else{
        int i;
        while(!feof(fp)){
            fgets(line,sizeof(line),fp);
            sscanf(line,"%s\t%s",IDInput,passInput);
            IDArray[i] = IDInput;
            passwordArray[i] = passInput;
            i++;
        }
    }
    fclose(fp);
}

void init(){
    DBInit();
    inputInit();

}

void inputInit(){
    IDInput = (char*)malloc(sizeof(char) * MAX_INPUT);
    passInput = (char*)malloc(sizeof(char) * MAX_INPUT);
}

void DBInit(){
    IDArray = (char**)malloc(sizeof(char*) * MAX_RECORDS);
    passwordArray = (char**)malloc(sizeof(char*) * MAX_RECORDS);

    int i,j;
    for(i=0;i<MAX_RECORDS;i++){
        IDArray[i] = (char*)malloc(sizeof(char) * MAX_INPUT);
        passwordArray[i] = (char*)malloc(sizeof(char) * MAX_INPUT);
    }
}

我的问题是,出于某种原因,当我尝试存储ID和密码时,我一直遇到分段错误。任何帮助解决这个问题都将非常感激。

3 个答案:

答案 0 :(得分:1)

int我创建了一个未初始化的野生i。替换为int i = 0;

答案 1 :(得分:0)

使用feof时要小心。你永远不应该使用feof作为循环的退出指示符。你可以看看this link,它解释了问题。

答案 2 :(得分:0)

第一个问题在于

IDArray[i] = IDInput;
passwordArray[i] = passInput;

在这些行中,您只需指定指针。这意味着您不要将内容复制到预分配的数组中。为此,您必须使用strcpystrncpy,例如

strcpy(IDArray[i], IDInput);
strcpy(passwordArray[i], passInput);

您的第二个错误是在循环终止中。该数组具有MAX_RECORDS个元素的空间,但您不会停留在MAX_RECORDS。你读到文件结尾,这可能要晚得多。

最后,正如@Malcolm已经指出的那样,你错过了i的初始化。