c - 我想知道为什么一个函数在从 x 调用时执行得很好,但在从 y 调用时却执行得不好

标签 c function execution

当从 archive() 调用时,readcont(char *filename) 执行得很好!但是,从 runoptions() 调用,它无法列出“已存档”的文件!这是为什么?
该程序必须在终端中运行。使用-h作为参数查看用法。 该程序用于将文本文件“归档”到“.rldzip”文件中。 readcont(char *x) 应显示文件 (*x)

中存档的文件

a) 调用成功

使用该程序归档 3 个文本文件: rldzip.exe a.txt b.txt c.txt FILEXY -a archive() 将调用 readcont,它将在创建二进制 FILEXY 后显示存档的文件。

b) 调用失败

文件创建后,使用: rldzip.exe FILEXY.rldzip -v 您可以看到该函数崩溃了!

我想知道为什么会发生这种情况!

/*
   Sa se scrie un program care:
   a) arhiveaza fisiere
   b) dezarhiveaza fisierele athivate
 */
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>

struct content{
  char *text;
  char *flname;
}*arc;

FILE *f;

void readcont(char *x){
  FILE *p;

  if((p = fopen(x, "rb")) == NULL){
    perror("Critical error: ");
    exit(EXIT_FAILURE);
  }
  content aux;
  int i;  
  fread(&i, sizeof(int), 1, p);
  printf("\nFiles in %s \n\n", x);
  while(i-- >1 && fread(&aux, sizeof(struct content), 1, p) != 0)
    printf("%s \n", aux.flname);          
  fclose(p);
  printf("\n\n");
}

void archive(int argc, char **argv){
  int i;

  char inttext[5000], textline[1000];
  //Allocate dynamic memory for the content to be archived!
  arc = (content*)malloc(argc * sizeof(content));
  for(i=1; i< argc; i++)
  {
    if((f = fopen(argv[i], "r")) == NULL){
      printf("%s: ", argv[i]);
      perror("");
      exit(EXIT_FAILURE);
    }
    while(!feof(f)){
      fgets(textline, 5000, f);
      strcat(inttext, textline);
    }
    arc[i-1].text = (char*)malloc(strlen(inttext) + 1);
    strcpy(arc[i-1].text, inttext);
    arc[i-1].flname = (char*)malloc(strlen(argv[i]) + 1);
    strcpy(arc[i-1].flname, argv[i]);
    fclose(f);
  }
  char *filen;
  filen=(char*)malloc(strlen(argv[argc])+1+7);
  strcpy(filen, argv[argc]);
  strcat(filen, ".rldzip");
  f = fopen(filen, "wb");
  fwrite(&argc, sizeof(int), 1, f);
  fwrite(arc, sizeof(content), argc, f);
  fclose(f);
  printf("Success! ");
  for(i=1; i< argc; i++)
  {

    (i==argc-1)? printf("and %s ", argv[i]) : printf("%s ", argv[i]);
  }
  printf("compressed into %s", filen);
  readcont(filen);
  free(filen);
}
void help(char *v){
  printf("\n\n----------------------RLDZIP----------------------\n\nUsage: \n\n Archive n files: \n\n%s $file[1] $file[2] ... $file[n] $output -a\n\nExample:\n%s a.txt b.txt c.txt output -a\n\n\n\nView files:\n\n %s $file.rldzip -v\n\nExample:\n %s fileE.rldzip -v\n\n", v, v, v, v);
}
void runoptions(int c, char **v){
  int i;
  if(c < 2){
    printf("Arguments missing! Use -h for help");
  }
  else{
    for(i=0; i<c; i++)
      if(strcmp(v[i], "-h") == 0){
        help(v[0]);
        exit(2);
      }
    for(i=0; i<c; i++)
      if(strcmp(v[i], "-v") == 0){
        if(c != 3){
          printf("Arguments misused! Use -h for help");
          exit(2);
        }
        else
        {
          printf("-%s-", v[1]);
          readcont(v[1]);
        }
      }
  }
  if(strcmp(v[c-1], "-a") == 0)
    archive(c-2, v);         
}

main(int argc, char **argv)
{
  runoptions(argc, argv);

}

最佳答案

擅自重新缩进代码后,一个问题立即凸显出来:runoptions调用readcont仅在 -v 的情况下在参数列表中找到。并且该调用被硬编码为 v[1] 。也许您想要 v[i]

关于c - 我想知道为什么一个函数在从 x 调用时执行得很好,但在从 y 调用时却执行得不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843623/

相关文章:

c - 我将如何写入内存?

javascript - Javascript 中不明确的函数声明

function - 如何将类声明为使用隐式参数扩展函数

c - 从不兼容的类型“float”分配给 'float' 是什么意思?

python - 如何快速从列表中获取唯一的单词?

MySql查询执行时间

c++ - 我在这个布隆过滤器实现中做错了什么?

c - 如何使用 "proc"文件系统计算 linux 中所有正在运行的进程的 CPU 利用率?

c - 从 stdin 回显 getchar 和 '\n' char

javascript - 理解一个接一个地执行 setTimeout() 函数