从循环中的指针中提取值

时间:2010-09-30 07:29:20

标签: c pointers

getLine是一个得到一条线的函数,我试图在getLine函数之外将线组合在​​一起。当我尝试在循环中执行此操作时,会混淆输出。我打赌它与指针有关,但我花了很多时间试图解决它。

  int num;
  int matrix[370];

  i=1;
  j=0;
  while(*(point=getLine(infile)) != -2){ 
      n[j]=*point;
      if(n[0] != n[j]){
        printf("matrix dim error 1");
        break;
      }
      while (i<=n[j]){
        matrix[i+(3*j)] = *(point+(i+(3*j)));
        i++;
        printf("%d", matrix[i+(3*j)]);
      }
      printf("%d %d %d\n", matrix[1],matrix[2],matrix[3]);
      j++;
  }
  fclose( infile );
}

int *getLine(FILE *infile){

  int l=0;
  int line[7];
  int i=1;
  int *point;

  while ((l=getNum(infile)) != -1){
    if(l==EOF){
      line[0]=EOF;
      point = &line[0];
      return(point);
    }
    line[i]=l;
    i++;
  }
  if(i==1){
    line[0]=-2;
    point = &line[0];
    return(point);
  }
  line[0]=(i-1); //stores the length of the line in first space
  printf("%d %d %d\n",line[1],line[2],line[3]);
  point = &line[0];
  printf("%d\n",*point);
  return(point);
}

int getNum(FILE *infile) {
  int c=0;
  int value=0;


  while ((c=fgetc(infile)) != '\n') {
    if(c==EOF){
      return(EOF);
    }
    if((c==32)||(c==13)){
      if(value != 0){ //Making sure a number has been gotten
        //printf("%d\n\n", value);
        return(value);
      }
      //otherwise keep getting characters
    }
    else if ((c<=47)||(c>=58)){
      printf("incorrect number input %d\n", c);
      exit(1);
    }
    else {
      value = (10*value) + (c - '0');
    }
  }
  return(-1);//flags that the end of line has been hit
}

2 个答案:

答案 0 :(得分:3)

有一个问题:

int *getLine(FILE *infile){
    int line[7];
    int *point;

    point = &line[0];
    return(point);
}

返回指向局部变量的指针。从函数返回时它变为无效。您可以在堆上分配它,或让调用者将其作为参数提供。

答案 1 :(得分:0)

而不是

while (i<=n[j]){

不是你的意思

while (i<=n[j][0]){

更多编辑:这实际上没问题,我忽略了作业中的*。

编辑:更多内容:

  • 没有检查getNum
  • 中是否超出了int的范围
  • getLine中没有检查超过7个值被读取(这将吹入行[7]
  • 我认为矩阵计算假定读取了3个值,getLine可以提供最多7个
  • matrix [i +(3 * j)] = *(point +(i +(3 * j))); ??点数只有7个大!!!所以对于第二个值,它将超出定义的数据。不应该读取矩阵[i +(3 * j)] = point [i];

HTH

马里奥

顺便说一句:我强烈建议:

  • 诉诸std-lib函数
  • 更好的命名(强烈建议不要在同一来源中使用i和j)