int main (int argc, char* argv[]){
int toSleep;
int produce;
int consume;
int i = 0;
//get the values for sleep, produce, consume
toSleep = atoi(argv[1]);
produce = atoi(argv[2]);
consume = atoi(argv[3]);
//check if the user input a vaild inpusts
//if(argc !=4){
//printf("You are missing an input\n");
// exit(0);
//}`enter code here`
if(toSleep == '\0' || produce == '\0' || consume == '\0' ){
printf("You are missing an input\n");
exit(0);
}else if (toSleep <=0 || produce<= 0 || consume <=0 ){
printf("Please provide a vaild inputs \n");
exit(0);
}else {
//continue to the program
}
我正在努力确保用户输入正好3个输入;如果一个丢失或为null,我应该打印一条错误消息并终止该程序。我尝试编译时总是遇到这个错误
./a4 makefile:5: recipe for target 'semaphore' failed make: *** [semaphore] Segmentation fault (core dumped)
有人能告诉我这里做错了吗?
答案 0 :(得分:6)
检查argc
的值,它会告诉你已经传递了多少个参数。
int main(int argc, char **argv)
{
if(argc != 4)
{
fprintf(stderr, "usage: %s sleep produce consume\n", argv[0]);
return 1;
}
toSleep = atoi(argv[1]);
produce = atoi(argv[2]);
consume = atoi(argv[3]);
....
}
请注意,argc
是参数数量加上文件名的值
执行二进制文件(更确切地说是二进制文件的执行方式)和
argv[0]
总是那个字符串。所以当argc == 4
时,有3个参数
已通过(argv[1]
,argv[2]
,argv[3]
)和argv[4] == NULL
。 argv
列表
总是NULL
终止。
如果您想检查某个人argv[i]
是否为NULL
,那么
if(argv[i] == NULL)
{
// argv[i] is NULL
}
但如果您正确检查argc
,通常不必执行这些检查。
但有时检查NULL
是有意义的,例如当你有时
可变数量的参数,当程序可以采用3或4个参数时,
然后检查argv[3] == NULL
是否也是一个选项,看看最后一个是否可选
论证已经过去了。但我还是喜欢检查argc
。
另请注意,toSleep
,produce
和consume
为int
,但检查
if(toSleep == '\0' || produce == '\0' || consume == '\0' )
技术上是正确的,我建议你这样做
if(toSleep == 0 || produce == 0 || consume == 0 )
更清楚地表明你的意图。