C编程-fgets()无限while循环
我在从文本文件中获取扩充矩阵时遇到问题。程序将在成功读取文本文件中的所有数据后简单地segfault,很可能是因为它仍在寻找另一个要到达的标记,或者fgets()未达到NULL状态?我真的迷路了C编程-fgets()无限while循环,c,while-loop,fgets,file-read,C,While Loop,Fgets,File Read,我在从文本文件中获取扩充矩阵时遇到问题。程序将在成功读取文本文件中的所有数据后简单地segfault,很可能是因为它仍在寻找另一个要到达的标记,或者fgets()未达到NULL状态?我真的迷路了 #include <stdio.h> #include <stdlib.h> #include <string.h> #include "apmatrix.h" #define NUMARGS 2 #define BUFSIZE 128 int main (
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "apmatrix.h"
#define NUMARGS 2
#define BUFSIZE 128
int main (int argc, char *argv[])
{
/* Matrices that will always be used */
Matrix* A;
Vector* b;
Vector* x;
iVector* p;
/* Used in LU factorization */
Matrix* L;
Matrix* U;
/* Standard character read-in variables needed */
char sep[] = " "; /* parsing separator is space */
char *z,*buffer; /* buffer and pointer to scan buffer */
FILE *ifp; /* source file */
unsigned buflen; /* length of line read */
int flag, count;
int Rows,Columns;/* to hold number read */
int CurrentRow=0;
/* first check to see if have required number for argc */
/* if not, error has occurred, don't do anything else */
if (argc == 2 || argc==3)
{
/* correct number of arguments used, try to open both files */
buffer = (char*) malloc(BUFSIZE); /* allocate buffer */
ifp = fopen (argv[1], "r"); /* open file for reading */
if (ifp && buffer) { /* if successful proceed */
/* read file line by line */
flag=0;
while (fgets(buffer, BUFSIZE, ifp) != NULL) {
/* defensive/secure programming */
buflen = strlen(buffer);
/* parse line */
z = strtok(buffer,sep);
/* take in the values of the rows and columns */
if(flag == 0){
++flag; /* Flag = 1 */
Rows = atoi(z); /* Convert the string to double */
printf(" %d",Rows);
z = strtok(NULL, sep); /* find next number */
Columns = atoi(z); /* Convert the string to double */
printf(" %d",Columns);
putchar('\n');
A = m_alloc(Rows,Columns);
b = v_alloc(Rows);
x = v_alloc(Rows);
p = iv_alloc(Rows);
L = m_alloc(Rows,Columns);
U = m_alloc(Rows,Columns);
}
/* take in the values of the matrices */
else{
for(int i = 0; i < Rows; i++){
A->mat[CurrentRow][i] = (Real) atof(z); /* Convert the string to an int*/
z = strtok(NULL, sep); /* find next number */
printf(" %2.3f ",A->mat[CurrentRow][i]);
}
b->vec[CurrentRow] = (Real) atof(z); /* Convert the string to an int */
printf(" %2.3f ",b->vec[CurrentRow]);
putchar('\n');
CurrentRow++;
putchar('\n');
}
}
fclose (ifp);
...
这些是我从代码中得到的结果
3 4
2.000 1.000 1.000 1.000
6.000 2.000 1.000 -7.000
-2.000 2.000 1.000 7.000
Segmentation fault (core dumped)
谢谢您的时间。:)
更新:我尝试运行gdb进行调试,但我一直在尝试使用文本文件运行核心转储。(例如../hw6 ge1.txt是我将在命令行中键入的内容)。我如何使用文本文件运行它,因为没有文本文件它是分段的
c
Continuing.
Expecting two or three arguments
The second argument must be a text file to read from.
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400a4e in m_free (M=0x0) at apmatrix.c:32
32 free(M->mat[0]); /* free data */
这将导致一个包含最多调试信息的可执行文件,可供gdb调试器使用
3) assure the source code is visible from where the program is to be run
(in the same directory works very well)
4) at the command line: gdb yourProgramName
5) from within gdb enter the following commands
br main <-- sets breakpoint at main
run <-- execution program until breakpoint reached
c <-- continue execution
6) when the program crashes, enter the following commands
bt <-- display a back trace
7) examine the back trace to see which line your program crashed on.
8) quit y <-- to exit the program
9) let us know which line that is.
paste/edit the line into your question
as a line number would be meaningless to us.
3)确保源代码在运行程序的位置可见
(在同一个目录中工作得很好)
4) 在命令行:gdb yourProgramName
5) 在gdb中输入以下命令
br主钩GDB并尝试查找导致崩溃的线路?无限循环或分段故障?不可能两个问题都有。z=strtok(NULL,sep);列=atoi(z)
不检查z===NULL
。请尝试验证buflen是否为0!如果是0,则不执行字符串解析(我认为您可能会中断while,但我不确定它是否正确!但如果您看到程序在buflen变为0后仍保持循环,则中断while是正确的方法)。
1) compile your program with -ggdb parameter
2) link your program with the -ggdb parameter
3) assure the source code is visible from where the program is to be run
(in the same directory works very well)
4) at the command line: gdb yourProgramName
5) from within gdb enter the following commands
br main <-- sets breakpoint at main
run <-- execution program until breakpoint reached
c <-- continue execution
6) when the program crashes, enter the following commands
bt <-- display a back trace
7) examine the back trace to see which line your program crashed on.
8) quit y <-- to exit the program
9) let us know which line that is.
paste/edit the line into your question
as a line number would be meaningless to us.