我的代码找不到问题

时间:2019-04-04 16:47:33

标签: c pointers struct

这是我的课堂作业,也是我第一次用c编写。我试图读取文件,将它们存储在缓冲区中,然后对读取的字节进行XOR运算,最后将输出存储到另一个文件中。一切似乎正确,但出现了细分错误。我不知道自己错过了什么。 我试图找出我使用的函数是否导致了这种情况,但是什么也没有。我也搜索了stackoverflow。我非常感谢您的帮助。

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


const int BUFFER_SIZE = 10000;
const long FILE_SIZE = 100000000;

typedef struct file_buffer_struct 
  {
    char * buffer;
    FILE * pFile;
  } file_buffer;



int main (int argc, char *argv[] ) {
 printf("hello | ");

  FILE *outputF ;
  int i;
  int j;
  int k;
  int result;

  file_buffer FB[10];
  outputF = fopen ( argv[argc] , "wb");



  if ( (argc < 4) && (argc > 13) ) // argc should be greater than 4 or less than or equal to 12 for correct execution 
    {
        printf( "please give arguments greater than 3 and less than 11 !");
        return 0;
    }


  //xor_all_buffers(&FB, &outputF);

  for(i=1; i<argc; i++)
  {
    FB[i].pFile = fopen( argv[i] , "rb" );
    FB[i].buffer = (char*) malloc (sizeof(char)*BUFFER_SIZE);
  }


  char * xored_buffer = (char *) malloc(BUFFER_SIZE); 


  for (int index=0; index < FILE_SIZE ;) {
      memset(xored_buffer, 0, sizeof(xored_buffer));

      for (int i=0; i < sizeof(FB); i++) {
        for (int j=0; j < BUFFER_SIZE; j++, index++) { 
          xored_buffer[j] = xored_buffer[j] ^ FB[i].buffer[index]; 
        }

      }
      result=fwrite(xored_buffer, sizeof(char), BUFFER_SIZE, outputF); 
  }


  printf("hello | ");

  return 0;
}

1 个答案:

答案 0 :(得分:4)

outputF = fopen ( argv[argc] , "wb");

Argc代表arg计数,它是argv(参数向量)数组中元素的数量。但是,C中的索引基于零。因此,如果数组的长度为n个元素,则最后一个元素的索引为n-1,而第一个元素的索引为0。

编辑:@Weather Vane ,因此很有帮助地指出argv中的最后一个元素实际上是NULL(零)值。解释为char *,这可能是您在此处的段错误。使用gdb和printf来帮助您调试并找出程序崩溃nice intro to gdb

if条件

if ( (argc < 4) && (argc > 13) ) 

通常来说,在尝试使用argc之前应先进行检查。想想如果没有给出论点怎么办?使用后为什么要检查。另外,您可能需要重新考虑这种情况。什么时候小于4 大于13。也许您打算使用OR?

for(i=1; i<argc; i++)

同样的问题索引都是从零开始的。

xored_buffer[j] ^ FB[i].buffer[index]

您实际在何处设置FB [i] .buffer [index]

您可能还需要检查sizeof运算符的实际工作方式

readingsimple example请记住,编译时已知大小的数组与可能指向一个或多个元素的指针不同。