我编写了一个函数,用于确定是否分配默认值(如果该标志不存在,则分配默认值,并指定用户在标志存在时传递的值)。我正在尝试用字符串测试我的函数,看看它是否给了我正确的数字。当我尝试运行测试时,我不断收到“Segmentation Fault”,它编译,但测试不起作用。 :(
这是我的头文件:
#ifndef COMMANDLINE_H
#define COMMANDLINE_H
#include "data.h"
#include <stdio.h>
struct point eye;
/* The variable listed above is a global variable */
void eye_flag(int arg_list, char *array[]);
#endif
这是我的实施文件:
#include <stdio.h>
#include "commandline.h"
#include "data.h"
#include "string.h"
/* Used global variables for struct point eye */
void eye_flag(int arg_list, char *array[])
{
eye.x = 0.0;
eye.y = 0.0;
eye.z = -14.0;
/* The values listed above for struct point eye are the default values. */
for (int i = 0; i <= arg_list; i++)
{
if (strcmp(array[i], "-eye") == 0)
{
sscanf(array[i+1], "%lf", &eye.x);
sscanf(array[i+2], "%lf", &eye.y);
sscanf(array[i+3], "%lf", &eye.z);
}
}
}
以下是我的测试用例:
#include "commandline.h"
#include "checkit.h"
#include <stdio.h>
void eye_tests(void)
{
char *arg_eye[6] = {"a.out", "sphere.in.txt", "-eye", "2.4", "3.5", "6.7"};
eye_flag(6, arg_eye);
checkit_double(eye.x, 2.4);
checkit_double(eye.y, 3.5);
checkit_double(eye.z, 6.7);
char *arg_eye2[2] = {"a.out", "sphere.in.txt"};
eye_flag(2, arg_eye2);
checkit_double(eye.x, 0.0);
checkit_double(eye.y, 0.0);
checkit_double(eye.z, -14.0);
}
int main()
{
eye_tests();
return 0;
}
答案 0 :(得分:3)
解决这个问题的绝对最简单的方法是在调试器中运行它。您可能甚至不需要学习如何单步执行代码或任何操作 - 只需启动,运行和读取该行。
如果您使用的是* nix系统:
-g
标记编译代码。gdb a.out
。(gdb) run
。bt
或where
应该为您提供堆栈跟踪 - 以及导致您出现问题的确切行。我确信你可以从那里解决这个问题作为答案;但如果没有,知道确切的行将使非常更容易研究和解决。
答案 1 :(得分:2)
您的循环条件错误。它应该是i < arg_list
想想i == arg_list
时会发生什么。
答案 2 :(得分:2)
错误在这里:
for (int i = 0; i <= arg_list; i++)
{ ///^^
if (strcmp(array[i], "-eye") == 0)
{
sscanf(array[i+1], "%lf", &eye.x);
//^^^
sscanf(array[i+2], "%lf", &eye.y);
sscanf(array[i+3], "%lf", &eye.z);
}
}
i <= arg_list
错误,数组索引从0开始,最大值为5 i+1, i+2,i+3
会给你超出范围的索引。