我正在尝试从文件中读取行,一次一个字符。
输入示例:
5 2
2
1 3
2 4 5
3
假设我正在尝试读取第一行,然后我首先读取"5",然后读取空格 (''(,然后读取"2",然后尝试将两个数字存储在一个数组中,我使用realloc
声明,因为我不知道在读取该行之前一行中会有多少个数字。 我只知道文件中将存在的行数numNodes
.
我正在尝试将数字存储在 2D 数组中,其中每行将具有不同的净长度。 由于我事先不知道每行的长度,所以我在读取每个数字后使用realloc
分配内存。
由于数字可以超过一位数,我将字符存储在num
字符数组中,当我遇到空格(' '(或换行符(''(时,我使用atoi
将其转换为数字,并将其存储在合适的行中,在使用realloc
为其分配内存后。
这是我的代码
FILE *fp;
fp = fopen("input.txt","r");
char ch;
int numNodes = 5, i = 0;
int **adjList = (int **)malloc(numNodes*sizeof(int *));
int len = 0,j,k=0;
char num[4];
for(i=0;i<numNodes;i++)
{
adjList[i] = NULL;
printf("Node %d -> ",i+1);
do
{
//read =
fscanf(fp,"%c",&ch);
if(ch!=' ' && ch!='n')
{
num[k]=ch;
k++;
}
else
{
k = 0;
len++;
adjList[i] = (int *)realloc(adjList[i],sizeof(int)*len);
adjList[i][len-1] = atoi(num);
for(k=0;k<4;k++)
num[k]='0';
}
}
while(ch!='n');
for(j=0;j<len;j++)
printf("%d ",adjList[i][j]);
printf("n");
len = 0;
}
但是,我在最后一行Segmentation Fault (core dumped)
,即打印2 4 5
之后。
任何帮助,如是,为什么此错误发生在最后一行?
编辑:
将ch
更改为fscanf
行中的&ch
将
ch[0]
更改为ch
(if
语句(在循环
do...while
之前添加了adjlist[i] = NULL
fscanf(fp,"%c",&ch);
if(ch!=' ' && ch!='n')
{
num[k]=ch;
k++;
}
else
{
k = 0;
len++;
adjList[i] = (int *)realloc(adjList[i],sizeof(int)*len);
adjList[i][len-1] = atoi(num);
for(k=0;k<4;k++)
num[k]='0';
}
当你读完一个数字时,k
将被4
。
for(k=0;k<4;k++)
num[k]='0';
然后你开始用k >= 4
读取下一个数字,从而越界访问num
。
num[k]=ch;
k++;
您还需要使用