-2

为什么我的 fillArray 函数代码导致我在运行它时遇到分段错误。我正在尝试从该函数中的字符输入中读取。为了帮助我解决这个问题,我将发布我的其他函数以及 fillArray 函数

#include <stdio.h>  /* standard header file */
#include "Assg6.h"

 void fillArray(int *array, int*count, char *buf){
*count = 0;
while(*buf){
    *(array++) = *(buf++);
    (*count)++;
 }
}

 void printArray(const int *array, int count, FILE *fpout){
int i;
for(i = 0; i <= count; i++){    
    fprintf(fpout, "%d ", *(array + i));
}
 }


int findMajority(int *array, int count, int *result){
int arrayb[count];
int i, counter, bcount = 0, ccount = 0, candidate, j;   
if(count % 2 != 0){
    int temp = *(array + count);
    for(i = 0; i <= count; i++){
        if(*(array + i) == temp){
            counter++;
        }
    }
    if(counter > (count/2)){
        *result = temp;
        return true;
    }
    else{
        count--;
    }
}
for(j=0; j <= count; j += 2){
    if(*(array + j) == *(array + j) +1){
        arrayb[bcount] = *(array + j);
        bcount++;
    }
}   
if(bcount == 1)
    candidate = arrayb[0];
    else
    findMajority(arrayb, bcount, result);

for(j=0; j <= count; j += 2){
    if(*(array + j) == candidate){
        ccount++;
    }
}
if(ccount > (count/2))
    return true;
    else
        return false;
}

这是主要功能:

#include <stdio.h>        // standard header file 
#include <stdlib.h>       // for the exit() function 

#define LEN 80            // used in fgets() function 

int main(int argc, char *argv[])   {
  FILE *fpin, *fpout;
  int a[LEN], count, majorityExists;
  char buf[LEN];
  int candidate;

  if (argc != 3) {
  printf("Usage: Assg6 InputFileName  OutputFileName\n");
  exit(1);
  }

  if ( (fpin = fopen(argv[1], "r")) == NULL)  {
  printf("Input file %s cannot be opened\n", argv[1]);
  exit(1);
  }

  if ( (fpout = fopen(argv[2], "w")) == NULL) {
  printf("Output file %s cannot be opened\n", argv[2]);
  exit(1);
  }

  while (fgets(buf, LEN, fpin) != NULL) {  // for each line in the input file
  fillArray(a , &count, buf);
  printArray(a, count, fpout);
  majorityExists = findMajority(a, count, &candidate);
  if (majorityExists) 
      fprintf(fpout, "\thas the majority element %d\n\n", candidate);
  else
      fprintf(fpout, "\tdoes not have a majority element\n\n");
  }

  fclose(fpin);
  fclose(fpout);

  return 0;
}
4

1 回答 1

0

1) 一定要熟悉你的调试器。这可能是 Visual Studio(在 Windows 上)、gdb(在 Linux 上),或一百万个其他替代方案中的任何一个。您的调试器是您的朋友。请至少熟悉设置断点、单步执行代码和查看变量内容的基础知识。

2)唯一重要的代码是:

a)您为数组分配空间的位置(例如int arrayb[count];),以及

b)您正在写入或读取该数组的所有地方。

  The moment you read data "off the edge" of your array ... game over.

3)顺便说一句:“可变长度数组”(如“int arrayb [count]”,其中“count”是一个输入参数)可能是个坏主意。请使用一个常量来初始化数组......至少在您熟悉所有“基础知识”之前。

恕我直言...

PS:“fillArray()”绝对是一个很好的选择,可以用来熟悉调试器中的“单步执行”和“查看变量”:)

于 2013-03-01T23:19:39.180 回答