我在调用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之后我都尝试过更多的内存,但似乎没有什么能解决这个错误。
答案 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);
}
}