我正在尝试使用fscanf()从文件中读取一行:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
char c, *string[4];
int i = 0,j[4];
fp = fopen("boil.txt", "r");
c = fgetc(fp);
if(fp == NULL)
{ printf("File read error\n");
exit(0);
}
while(c != '\n')
{
fscanf(fp, "%s %d ", string[i] , &j[i]);
i++;
c = fgetc(fp);
}
for(i = 0; i < 4; i++)
{
printf("%s %d\n", string[i], j[i]);
}
}
boil.txt如下:
boil 4 boilmilk 3 boilwater 5 heat 10
为什么这个程序会给出分段错误?
答案 0 :(得分:5)
因为您没有为这些字符串预留空间:
char *string[4];
是指向字符串的指针数组,但您需要有空间来存储这些字符串,例如:
char temp[256];
fscanf(fp, "%s %d ", temp , &j[i]);
string[i] = strdup(temp);
编辑:
正如iRove所指出的那样,strdup
不是标准的一部分(但在许多实现中都可用),如果你不能使用strdup
,则另一种选择是:
string[i] = malloc(strlen(temp) + 1);
if (string[i] == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
strcpy(string[i], temp);
不要忘记最后免费通话(不再需要字符串时)
for (i = 0; i < 4; i++) free(string[i]);