2

我认为我的代码存在文件未正确传递的问题。输入是一个包含三行 1 2 3 的文件;4 5 6; 7 8 9;并且输出是分段错误(核心转储),输出应该打印第一行 1 2 3。

#include <stdio.h>
#include <stdlib.h>

int getNum();
int getLine();
int getMatrix();
int det1();
int det2();
int det3();
int det4();
int det5();
int det6();


main(){
  FILE *infile;
    infile = fopen("matrix.txt","r");
  int line[6];
  int lineSize;
  int error;
  getLine(line,lineSize,infile);
  printf("%d %d\n", line[0],line[1]);
  fclose(infile);
}

/***********************************************
Name : getLine
Description : To get the line of numbers
Arguments :  infile - the file pointer with numbers inside
             line[]  - the line of numbers
             lineSize - size of line
Returns : 1   - If no errors were encountered
          2 - If END OF FILE was reached
          -1 if non number detected

*************************************************/
int getLine(int line[], int lineSize, FILE *infile){
  int value;
  int l;
  lineSize=0;

  while(value != '\n'){
    value=0;
    l=getNum(value,*infile);
    if (value==EOF){
      return(2);
    }
    line[lineSize]=value;
    lineSize++;
  }
  if (l == -1){
    return(-1);
  }
  return(1);

}


/***********************************************
Name : getNum
Description : To get the Next number from file
Arguments :  infile - the file with numbers inside
             value  - the value of number grabed
Returns : 1   - If no errors were encountered
          -1  - If letter or non number detected
*************************************************/
int getNum(int value, FILE *infile){

  int c;
  int error=1;

  while ((c=getc(infile)) != EOF){
    if (c=='\n'){
      value = '\n';
      return(1);
    }
    if(c==32){//checking for space
      if (error == -1){
        return(-1);
      }
      else{
        return(1);
      }
    }
    else {
      value = 10*value + c - '0';
    }
    if((c<=47)||(c>=58)){
      printf("incorrect number input %d\n",c);
      error = -1;
    }
  }
  value = EOF;
  return(1);

}
4

3 回答 3

4

浏览您的代码...

int getNum();
int getLine();
int getMatrix();
int det1();
/* ... */

这些声明对编译器说:“嘿,编译器,请注意我将使用这些名称(getNum、getLine、getMatrix、det1、...)调用函数并且它们返回int,但我没有告诉你它们是什么参数接受。当我使用它们时请相信我“

将函数引入编译器时最好使用原型

int getNum(int value, FILE *infile);
int getLine(int line[], int lineSize, FILE *infile);
/* ... */

这些声明对编译器说:“嘿,编译器,请注意我将使用这些名称调用函数,它们返回int并接受这些参数。如果我犯了错误,请抱怨让我知道我的错误”

...继续在 main() 内部

      /* ... */
      int lineSize;
      int error;
      getLine(line,lineSize,infile);
      /* ... */

您声明lineSize但没有为变量提供值。当程序调用 getLine 时,lineSize 的值几乎可以肯定是错误的值(它甚至可能在调用该函数之前使您的计算机崩溃)。在使用它们之前初始化(几乎)所有变量。

      /* ... */
      int lineSize = 0;
      int error = 0;
      getLine(line,lineSize,infile);
      /* ... */

我没有更多的浏览...

建议:提高编译器警告级别,不要在编译产生警告时运行程序。

于 2010-10-02T21:42:20.820 回答
3

getLine()中,当您给infile FILE*函数提供时getNum(),您取消引用它:

 l=getNum(value,*infile);

getNum()只会期望一个正常的FILE*,而不是取消引用的。所以传递infile给该函数不变:

 l=getNum(value,infile);

此外,while(value != '\n')循环可能会永远运行,一直写到lines数组的末尾,直到出现分段错误。value,它控制循环何时终止,永远不会被修改(也没有初始化,使其以任意值开始)。该getNum()函数可能应该修改value,获取作为参数传递的整数的副本,然后修改该副本。原件value从未改变。

如果您希望函数更改value变量,则必须使用指向value并用于修改该变量的指针:

int getNum(int *value, ...) {
   *value = 5;
   ...
}

l=getNum(&value, infile);

value此外,一个整数变量 被分配并与'\n'字符文字进行比较也有点可疑。您确定要使用整数值'\n'作为循环的终止条件吗?

于 2010-10-02T21:27:42.853 回答
0

虽然不是直接的答案,但我建议在随机位置粘贴一些 printf 语句;这将使您相对快速地缩小崩溃的确切点。移动它们,直到你有两个 printfs 将一行代码括起来,然后你就知道它是崩溃的罪魁祸首,这会让你更好地诊断。

于 2010-10-02T21:38:19.657 回答