在argv上使用fopen时的分段错误

时间:2014-01-10 03:32:11

标签: c segmentation-fault

当我尝试执行以下代码时,我仍然遇到分段错误...

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

int main(int argc, char *argv[]){
  if (argc < 4){
     fprintf (stderr,"usage message");
     return (1);
  }

  FILE *src = fopen(argv[1],"r"); //file pointer to inputFile
  FILE *outputFile = fopen(argv[2],"w"); //file pointer to outputFile
  int nth = atoi(argv[3]); //nth term value
  printf("nth term is %d",nth);
  int c;
  int currNum;
  int currCount = 1;

  c = fscanf(src, "%d\n",currNum); //read ints line by line
  while( c == 1 ){
    fscanf(src,"%d\n",currNum);
    ++currCount;
    if (currCount % nth == 0){
      fprintf (outputFile, "%d\n", currNum);
    }
  }
}

在我将它们用作文件名之前,我不确定是否必须以某种方式转换argv [1]和argv [2]。

3 个答案:

答案 0 :(得分:1)

您是否提供了命令行参数?您应该在打开文件之前使用if语句进行检查。例如,您可以添加

if ( argc < 4 )
{
    printf ( stderr, "usage message\n" );
    return ( 1 );
}

另外,将stoi的{​​{1}}更改为argv[3]

您无需为atoi添加\n。只需fscanf即可。

答案 1 :(得分:1)

"fscanf"提供输入参数是错误的。检查下面一个.......

c = fscanf(src, "%d\n",currNum);  // wrong
c = fscanf(src, "%d\n",&currNum); 
fscanf(src,"%d\n",&currNum);

答案 2 :(得分:0)

您可以使用atoi转换为int

int nth = atoi( argv[3] );

你也可以NULL检查文件* src和outfile。如果您没有提供正确的路径,那么fopen可能会失败。