调用fgets从文件读取行时出现分段错误

时间:2013-10-29 03:16:02

标签: c segmentation-fault fgets strtok

我在调用fgets大约20次之后遇到了段错误。我打开一个文件(不返回null)。它的格式为:

 num1: value1
 num2: value2
 num3: value3

然后从文件中读取行,将值存储到数组中,使用nums作为位置。这是代码出错的代码:

编辑:声明myArray和line:

char myArray[3000];    
char * line;
char * word;

line = (char *) malloc(100);
word = (char *) malloc(16);

while(fgets(line, 99, file)) {
    printf("%s\n", line);
    word = strtok(line, " :");
    name = (int) strtol(word, NULL, 16);

    word = strtok(NULL, " \n");
    myArray[name] = word;
}

您会注意到我在收到后立即打印出该行。该文件有26行,但它只打印23行然后是seg错误。现在,这是我对fgets不完全了解的事情,还是我得到的一些synthax不正确?我尝试过分配更多的内存,或者说更多的内容。在每次调用strtok之后我都尝试过更多的内存,但似乎没有什么能解决这个错误。

1 个答案:

答案 0 :(得分:2)

问题是行myArray[name] = word;你从输入行获取一个数组索引,然后将该位置的字符设置为你的单词地址的低位...我怀疑这实际上是你的想做。

您的代码还存在其他一些问题,您正在从行word = (char *) malloc(16);泄漏内存,因为strtok会将指针返回到您最初传递它的字符串中。实际上你不需要为问题中所写的代码malloc任何东西,所以你可以:

char myArray[3000];    
char line[100];
char *word = NULL;

word需要成为指针,因为它持有strtok()的结果

你显然不明白指针,你需要先了解它,然后才能理解为什么你的代码没有按照你期望的方式运行。

如果你说你的代码实际意味着什么,我可以给你一些如何解决它的提示,但目前我还不能确定预期结果是什么。

编辑:您打算用十六进制读取数字吗? strtol()的最后一个参数是用于转换的基础...您也可以使用atoi()

所以你的循环看起来像:

char myArray[3000];    
char line[100];
char *word = NULL;


while(fgets(line, 100, file)) {
    printf("%s\n", line);
    word = strtok(line, " :");
    if(word == NULL) continue;
    name = atoi(word); /* only if you didn't actually want hexadecimal */

    word = strtok(NULL, " \n");
    if(word == NULL) continue;

    if(name > 0 && name < 3000) { /* as I said in a comment below */
        strncpy(myArray + name, word, 3000 - name);
    }
}