Я не смог найти проблему с моим кодом - PullRequest
0 голосов
/ 04 апреля 2019

Это мое классное задание, и я впервые пишу на с. Я пытаюсь прочитать файлы, сохранить их в буфере, а затем 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 Ответ

4 голосов
/ 04 апреля 2019
outputF = fopen ( argv[argc] , "wb");

Argc обозначает arg count, который является числом элементов в массиве argv (вектор аргумента).Однако индексы в C основаны на нуле.Таким образом, если массив имеет длину из n элементов, индекс последнего элемента равен n - 1, а первый элемент - 0.

РЕДАКТИРОВАТЬ: @ Weather Vane , поэтому полезно указать на последнийэлемент в argv на самом деле является нулевым (нулевым) значением.Интерпретируется как char *, который, вероятно, является вашим segfault прямо здесь.Используйте gdb и printf, чтобы помочь вам отладить и выяснить, когда ваша программа вылетает хорошее введение в gdb

Условие if

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

Вообще говоря, следует проверить перед вамипопытка использовать argc.Подумайте, что если бы не было аргументов?Зачем проверять после использования.Также вы можете пересмотреть это условие.Когда он будет меньше 4 и больше 13. Возможно, вы намеревались использовать ИЛИ?

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

Опять же, те же индексы проблем основаны на нулях.

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

Где вы фактически установили значение FB [i] .buffer [index]

Возможно, вы также захотите проверить, как на самом деле работает оператор sizeof

, читая и простой пример Имейте в виду, что массив с известным размером времени компиляции отличается от указателя, который может указывать на один или несколько элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...