我有这样的问题:
玩家通常坐成一圈。指定先走的玩家说出数字“1”,此后每位玩家轮流数一个数。但是,任何可被“A”整除的数字,例如three 被 fizz 和任何可被 'B' 整除的单词替换,例如五个字的嗡嗡声。可被两者整除的数字成为嘶嘶声。犹豫或犯错的玩家要么被淘汰。
编写一个程序,在给定从输入文本文件读取的“A”/“B”和“N”的值的情况下,打印出这种场景生成的模式。输入的文本文件包含三个空格分隔的数字,即 A、B、N。然后程序应打印出最终的数字系列,使用“F”表示 fizz,“B”表示“buzz”,“FB”表示 fizz buzz。
输入是这样的:
您的程序应该读取一个包含多个换行符分隔行的输入文件(在命令行上提供)。每行将包含 3 个以空格分隔的数字。第一个数字是第一个要除以的数字(本例中为“A”),第二个数字是第二个要除以的数字(本例中为“B”),第三个数字是你应该数到的地方('N'在这个例子中)。您可以假设输入文件的格式正确并且数字是有效的正整数。例如。
3 5 10
2 7 15
输出:
打印系列 1 到 N,将可被“A”整除的数字替换为 F,可被“B”整除的数字替换为“FB”。由于输入文件包含多组值,因此您的输出将每组打印一行。确保打印的每一行中没有尾随空格。例如
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;
}
当我在我的计算机上运行上述程序时,它运行良好。但是在线编译运行时,报segmentation fault。即使是在线编译器选择的文件在我的电脑上也没有给出任何错误。 在线编译器的文件在这里:
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
我的代码有什么问题?
最佳答案
问题出在这里:
FILE *f = fopen(argv[1],"r");
while(fscanf(f,"%d %d %d",&a,&b,&n) == 3)
如果没有提供命令行参数,argv[1]
为 NULL,访问它会使程序崩溃。
此外,如果给出的文件名不存在,fopen()
将返回 NULL。稍后将其提供给 fscanf()
也会崩溃。
您应该为 argc > 1
和 f != NULL
添加检查。
除此之外,很明显,在线编译时,参数没有正确给出——我不知道你如何解决这个问题。
关于c - 在线编译时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23585790/