我正在尝试通过C中的输入文件读取数组。我在显示数组后出现分段错误(核心转储)错误。任何人都可以解决这个问题。 这是我的c程序
#include <stdio.h>
#include<stdlib.h>
int main()
{
int c, i, j, row, col, nl, cr,nt;
col = nl = cr = nt=0;
int k;
row=1;
FILE *fp = fopen("IO.txt", "r");
// Figure out how many rows and columns the text file has
while ((c = getc(fp)) != EOF)
{
if (c == '\n')
nl++;
if (c == '\r')
cr++;
if(c=='\t')
nt++;
col++;
if (c == '\n')
row++;
putchar(c);
}
//row=row+1;
col = (col - (nl + cr+nt));
col = (int) (col/row);
char **array = malloc(sizeof(char *) * row);
for(int k=0;k<row;k++)
{
array[c] = malloc(sizeof(char) * col);
}
if(fp)
{
for( ;; )
{
c = getc(fp);
if ( c == EOF )
{
break;
}
if ( c != '\n' && c != '\r' )
{
array[i][j] = c;
if ( ++j >= col )
{
j = 0;
if ( ++i >= row )
{
break;
}
}
}
}
fclose(fp);
}
for ( i = 0; i < row; i++ )
{
for ( j = 0; j < col; j++ )
{
putchar( array[i][j]);
}
putchar('\n');
}
free(array);
array=NULL;
return 0;
}
这是我的输入文件
IO.txt
0 0 0 0 0 0 0
0 0 1 0 2 0 0
0 1 0 4 3 6 0
0 0 4 0 0 5 0
0 2 3 0 0 7 8
0 0 0 0 8 0 9
0 0 0 0 8 9 0
答案 0 :(得分:3)
在此代码中:
for(int k=0;k<row;k++){
array[c] = malloc(sizeof(char) * col);
}
您应该使用k
而不是c
来访问array
。 c
完全是另一个变量。
您的编译器应该已经警告过您。始终注意警告:
io.c: In function ‘main’: io.c:7:9: warning: unused variable ‘k’ [-Wunused-variable] int k; ^
此外,sizeof(char)
明确为1,因此您永远不需要指定它。
所以循环应该如下所示:
for(int k=0;k<row;k++){
array[k] = malloc(col);
}
此外,在释放array
之前,您忘记释放array
的元素。你应该这样做:
for (int k=0; k<row; k++){
free(array[k]);
}
此外,您还没有正确计算列数。这段代码:
if(c=='\t')
nt++;
col++;
每次循环都会增加col
,因为col++
不在if(c=='\t')
范围内。你需要大括号:
if (c =='\t') {
nt++;
col++;
}
此外,在您第二次阅读之前,您已经忘记关闭然后重新打开文件,或者回头查看。 if(fp)
没有为您做任何事情。你应该这样做:
/* Close and then reopen the file */
fclose(fp);
fp = fopen(fopen("IO.txt", "r"));
或者这个:
/* Seek to the beginning of the file */
fseek(fp, 0, SEEK_SET);
此外,您忘了将i
和j
初始化为0
。编译器不会为你做这件事,所以你需要:
int c, i = 0, j = 0, row, col, nl, cr, nt;
此外,您还没有正确计算列数或行数。通过回车计算行不是很可靠,因为在文件的最后一行可能没有回车符,但假设有,则row
初始化为0
,并且列计算是:
col = (col / row) + 1;
另外,当您第二次阅读文件时,您忘记检查选项卡。添加字符到数组的条件应该是:
if ( c != '\n' && c != '\r' && c != '\t')
这是所有的逻辑问题。其余的只是卫生和风格:检查文件是否成功打开,检查malloc()
的结果等。