gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:16:23 26 4
gpt4 key购买 nike

我在从文本文件中获取增强矩阵时遇到问题。成功读取文本文件中的所有数据后,程序将简单地出现段错误,很可能是因为它仍在寻找另一个要到达的标记,或者 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);

...

我没有打印其余的代码,因为我认为它与手头的问题无关。我想知道为什么会出现这个问题以及如何在代码中修复它,因为稍后我将需要这些信息来解决程序中的 Ax=b 问题。文本文件为我提供了增广矩阵 [A|b],因此我使用 LU 分解求解 x。我认为这可能与缓冲区本身有关,但我对 C 编程也缺乏经验。

我正在阅读的文本文件也是这样写的......

 3 4
2 1 1 1
6 2 1 -7
-2 2 1 7

这些是我从代码中得到的结果

  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 */

最佳答案

1) compile your program with -ggdb parameter
2) link your program with the -ggdb parameter

这将生成一个包含最大量调试信息的可执行文件,供 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.

关于C 编程 - fgets() 无限 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com