我被要求将随机播种放入用户键入-r时调用的程序中。它显示为看起来像
-r1234567
因此,作为全局变量,我设置Random = 1234567。
我也把它添加到我的函数顶部:
printf("Seed: %d\n", Random);
srand48(Random);
每次我使用-r1234567我的程序段错误并说:
Program received signal SIGSEGV, Segmentation fault.
____strtol_l_internal (nptr=0x0, endptr=0x0, base=10, group=<optimized out>,
loc=0x7ffff7ad8020) at ../stdlib/strtol_l.c:298
298 ../stdlib/strtol_l.c: No such file or directory.
(gdb) bt
#0 ____strtol_l_internal (nptr=0x0, endptr=0x0, base=10, group=<optimized out>,
loc=0x7ffff7ad8020) at ../stdlib/strtol_l.c:298
#1 0x00007ffff77589e0 in atoi (nptr=<optimized out>) at atoi.c:28
#2 0x0000000000401d8c in getCommandLine (argc=6, argv=0x7fffffffe238)
at prog.c:171
#3 0x0000000000401514 in main (argc=6, argv=0x7fffffffe238) at prog.c:35
(gdb) up
#1 0x00007ffff77589e0 in atoi (nptr=<optimized out>) at atoi.c:28
28 atoi.c: No such file or directory.
(gdb) up
#2 0x0000000000401d8c in getCommandLine (argc=6, argv=0x7fffffffe238)
at prog.c:171
warning: Source file is more recent than executable.
在我的命令中:案例如下:
while ((c = getopt(argc, argv, "g:n:a:h:s:d:v:r")) != -1)
case 'r': Random = atoi(optarg); break;
因此,用户希望使用种子进行随机化。他们这样做./program -r1234567。然后进入上面提到的两行代码并且应该随机化。
有什么建议吗?
答案 0 :(得分:2)
您的问题是getopt
调用,因为您忘记告诉getopt
-r
参数取值:
getopt(argc, argv, "g:n:a:h:s:d:v:r:")
/* ^ */
/* | */
/* Add colon here */
因此,当您致电optarg
时,NULL
指针为atoi
。
答案 1 :(得分:0)
你是从命令行给出-r1234567,你如何解析它并给它ato atoi?
如果atoi得到“1234567”作为它的参数那么应该没有任何问题..你能粘贴解析argv [1]的逻辑吗?
答案 2 :(得分:0)
将Random声明为int?。 srand48需要很长时间作为参数,所以你应该使用atol而不是atoi:
long Random = 42;
printf("Seed: %d\n", Random);
srand48(Random);
答案 3 :(得分:0)
问题是..你在参数r的末尾缺少“:”因为这个NULL被传递给atoi ..尝试在getopt !!的r末尾添加“:” / p>