0

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

 num1: value1
 num2: value2
 num3: value3

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

编辑:声明 myArray 和行:

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 不完全了解,还是我得到了一些不正确的合成器?我尝试为行分配更多内存,或者为单词分配更多内存。每次调用 strtok 后,我也尝试过 malloc 更多内存,但似乎没有任何东西可以解决段错误。

4

1 回答 1

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);
    }
}
于 2013-10-29T04:14:09.513 回答