Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我找不到我的代码有问题_C_Pointers_Struct - Fatal编程技术网

C 我找不到我的代码有问题

C 我找不到我的代码有问题,c,pointers,struct,C,Pointers,Struct,这是我的课堂作业,也是我第一次用c语言写作。我试图读取文件,将它们存储在缓冲区中,然后对读取的字节进行异或运算,最后将输出存储到另一个文件中。一切似乎都是正确的,但我有一个分割错误。我想不出我错过了什么。 我试图找出我使用的函数是否导致了这种情况,但什么都没有。我还搜索了stackoverflow。我非常感谢你的帮助 #include <stdio.h> #include <stdlib.h> #include <string.h> const int B

这是我的课堂作业,也是我第一次用c语言写作。我试图读取文件,将它们存储在缓冲区中,然后对读取的字节进行异或运算,最后将输出存储到另一个文件中。一切似乎都是正确的,但我有一个分割错误。我想不出我错过了什么。 我试图找出我使用的函数是否导致了这种情况,但什么都没有。我还搜索了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;
}
#包括
#包括
#包括
const int BUFFER_SIZE=10000;
const long FILE_SIZE=100000000;
类型定义结构文件\u缓冲区\u结构
{
字符*缓冲区;
文件*pFile;
}文件缓冲区;
int main(int argc,char*argv[]){
printf(“你好”;”;
文件*outputF;
int i;
int j;
int k;
int结果;
文件缓冲区FB[10];
outputF=fopen(argv[argc],“wb”);
如果((argc<4)&&(argc>13))//argc应大于4或小于或等于12才能正确执行
{
printf(“请给出大于3且小于11的参数!”);
返回0;
}
//异或所有缓冲区(&FB和&outputF);
对于(i=1;i
Argc代表arg count,arg count是argv(参数向量)数组中的元素数。但是,C中的索引是从零开始的。因此,如果数组的长度为n个元素,则最后一个元素的索引为n-1,第一个元素的索引为0

编辑:所以很有帮助地指出argv中的最后一个元素实际上是一个空(零)值。解释为char*,这可能是您的segfault。使用gdb和printf帮助您调试并找出程序何时崩溃

if条件

if ( (argc < 4) && (argc > 13) ) 
您实际在哪里设置了FB[i].buffer[index]的值

您可能还想检查sizeof操作符实际上是如何工作的


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

文件打开了吗?缓冲区分配成功了吗?使用调试器。检查每个函数返回的每个值。如果幸运的话,分段错误可能会因多种原因出现(如果您运气不好,代码将持续工作,使您不会注意到错误)。将来查找原因的最简单方法是使用调试器,调试器将为您提供比隐藏的错误消息更多的工作。“
if((argc<4)和&(argc>13))
”:在同一个tme中,
argc
怎么可能小于4而大于11呢?@alk,谢谢你指出这一点out@Babydesta
argv[argc]
NULL
,数组末尾的一个前哨值(在本例中)在争论之后。同样值得指出的是,
argc
永远不会小于4,也不会大于13。大概应该是
|
而不是
&
。谢谢大家,我的代码仍然不起作用,但我知道我正在取得进展。非常感谢。
(argc<4)&(argc>13)
“永远都不是真的。”。
if ( (argc < 4) && (argc > 13) ) 
for(i=1; i<argc; i++)
xored_buffer[j] ^ FB[i].buffer[index]