Linux 分段错误(核心转储)

问题描述 投票:0回答:1

我需要模拟2个文件之间grep -f命令的效果 代码编译时没有错误,但是当我运行它而不是输出时,它显示分段错误(核心转储) 我怎么能这样呢?另外,如果您可以帮助提供一种更好的方法来打开 f1 和 f2,而不使用 aux1 和 aux2 来提供文件名,那就太好了。预先感谢。

//我知道我必须检查代码是否有足够的参数,如果没有,我应该对 stderr 做一些事情(这是我在课堂上被告知要做的事情,但我不知道如何做)

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

int main(int argc, char *argv[])
{
  FILE *file1;
  FILE *file2;
  char aux1[100]="",aux2[100]="";
  strcpy(aux1,argv[1]);
  strcpy(aux2,argv[2]);
  file1 = fopen("aux1","r");
  file2 = fopen("aux2","r");

  char s1[100]="",s2[100]="";
  char aux[100]="";

  while(fscanf(file1,"%s",aux)!=EOF)
  {
    strcat(s1,aux);
    strcat(s1," ");
  }
  s1[strlen(s1)-1]='\0';

  while(fscanf(file2,"%s",aux)!=EOF)
  {
    strcat(s2,aux);
    strcat(s2," ");
  }
  s2[strlen(s2)-1]='\0';

  printf("%s\n",strstr(s2,s1));

  return 0;
}
c linux file terminal segmentation-fault
1个回答
0
投票
  FILE *file1;
  FILE *file2;
  char aux1[100]="",aux2[100]="";
  strcpy(aux1,argv[1]);
  strcpy(aux2,argv[2]);
  file1 = fopen("aux1","r");
  file2 = fopen("aux2","r");
  • 在将命令行参数复制到
    aux1
    aux2
    之前,您无需检查是否提供了任何命令行参数。
  • 您使用
    "aux1"
    "aux2"
    作为文件名称,而不是
    aux1
    aux2
    的内容。
while(fscanf(file1,"%s",aux)!=EOF)
  {
    strcat(s1,aux);
    strcat(s1," ");
  }
  • 不会检查此连接是否超过
    s1
    的长度,该长度仅足以容纳 100 个字符。
printf("%s\n",strstr(s2,s1));
    如果未找到子字符串,则
  • strstr()
    返回
    NULL
    。在将其传递给
    printf()
    之前,您不会检查其返回值。
© www.soinside.com 2019 - 2024. All rights reserved.