在线编译时出现分段错误

时间:2014-05-10 20:09:56

标签: c segmentation-fault runtime-error

我遇到这样的问题:

玩家通常坐成一圈。指定首先进入的玩家说出数字“1”,然后每个玩家轮流计算一个数字。但是,任何可被'A'整除的数字,例如三个被fizz替换,任何可被'B'整除,例如五个字嗡嗡声。被两者整除的数字成为嘶嘶声。犹豫不决或犯错的玩家要么被淘汰。

编写一个程序,打印出由这样一个场景生成的模式,给出从输入文本文件中读取的'A'/'B'和'N'的值。输入文本文件包含三个空格分隔的数字,即A,B,N。程序应打印出最后一系列数字,使用'F'表示fizz,'B'表示'buzz'和'FB'表示fizz buzz。 / p>

输入如下:

您的程序应该读取包含多个换行符分隔行的输入文件(在命令行中提供)。每行包含3个以空格分隔的数字。第一个数字是除以的第一个​​数字(在这个例子中是'A'),第二个数字是除以的第二个数字(在这个例子中是'B'),第三个数字是你应该数到的数字('N')在这个例子中)。您可以假设输入文件格式正确,并且数字是有效的正整数。例如。

3 5 10

2 7 15

输出:

打印出系列1到N,用F替换为'A'的数字,用B除以'B'的数字和用'FB'整除的数字。由于输入文件包含多组值,因此输出将打印出每行一行。确保您打印的每一行都没有尾随空格。 E.g。

1 2 F 4 B F 7 8 F B

1 F 3 F 5 F B F 9 F 11 F 13 FB 15

约束: 测试用例的数量<= 20 “A”在范围[1,20] “B”在范围[1,20] “N”在[21,100]范围内

现在我写了以下代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
  int a,b,n,i;
  int part;
  /* char file[200]; */
  /* scanf("%s",file); */
  FILE *f = fopen(argv[1],"r");

while(fscanf(f,"%d %d %d",&a,&b,&n) == 3)
{
  for ( i = 1 ; i <= n ; i++ )
  {
    if ( i % a == 0 && i % b == 0 )
    {
        printf("FB ");
        continue;
    }
    if ( i % a == 0 )
    {
        printf("F ");
    }
    else if( i % b == 0 )
    {
        printf("B ");
    }
    else
    {
        printf("%d ",i);
    }
  }
  printf("\n");
}
//printf("%d",all);
return 0;
}

当我在计算机上运行上述程序时,它运行良好。但是在在线编译和运行的情况下,它会给出分段错误。即使是在线编译器选择的文件也没有在我的计算机上给出任何错误。 在线编译器的文件在这里:

6 14 50
15 12 53
14 2 37
15 11 67
3 8 100
12 14 30
7 12 64
19 9 97
20 11 76
16 10 76
13 13 53
1 7 65
10 13 86
3 1 60
4 17 99
8 10 51
10 12 65
10 19 70
8 17 100
16 9 52

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:3)

问题在于:

FILE *f = fopen(argv[1],"r");
while(fscanf(f,"%d %d %d",&a,&b,&n) == 3)

如果没有提供命令行参数,argv[1]为NULL,访问它会导致程序崩溃。

此外,如果给出了不存在文件的名称,fopen()将返回NULL。之后fscanf()也会崩溃。

您应该添加argc > 1f != NULL

的支票

除此之外,显然,在网上编译时,论据没有正确给出 - 我不知道如何解决这个问题。