C编程-fgets()无限while循环

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 (

我在从文本文件中获取扩充矩阵时遇到问题。程序将在成功读取文本文件中的所有数据后简单地segfault,很可能是因为它仍在寻找另一个要到达的标记,或者fgets()未达到NULL状态?我真的迷路了

#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.