首页 文章

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

提问于
浏览
0

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

num1: value1
 num2: value2
 num3: value3

然后从文件中读取行,将值存储到数组中,使用nums作为位置 . 以下是seg fault的代码:

编辑:声明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之后我都尝试过malloc -ing更多的内存,但似乎没有什么能解决这个错误 .

1 回答

  • 2

    这些问题实际上是你想要做的事情 myArray[name] = word; .

    有's some other problems with your code, you'从行 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);
        }
    }
    

相关问题