[英]Checking cmd line arguments in C
我试图从C中的cmd行获取2个参数。第二个数字不能高于100.但是,当使用23 405
运行程序时,它会执行而没有任何错误。
int main(int argc, char * argv[]){
char *inputs;
int input1= strtol(argv[1], &inputs, 10);
int input2= strtol(argv[2], &inputs, 10);
if ((*inputs!='\0') || (argc < 3) || (input1 > 1) || (input2 >= 100)
|| (input1 >= input2))
{
printf("Error.");
return 1}
return 0;
}
我是C新手所以非常感谢任何帮助!
argv[2]
应该确保argc >= 3
return 1}
应该return 1;}
以下code
可以工作:
#include<stdio.h>
int main(int argc, char * argv[]) {
if (argc < 3) {
perror("Error");
return 1;
}
char *inputs1;
char *inputs2;
int input1= strtol(argv[1], &inputs1, 10);
int input2= strtol(argv[2], &inputs2, 10);
if (*inputs1!='\0' || *inputs2 != '\0' || input1 > 1 || input2 >= 100 || input1 >= input2) {
printf("Error.");
return 1;
}
return 0;
}
我不确定inputs
的目的是什么(除非检查@yano指出的输入错误)。 考虑以下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
int input1, input2;
/* Check For Error */
if(argc != 3)
{
printf("Need Two!\n");
return 2;
}
input1= strtol(argv[1], NULL, 10);
input2= strtol(argv[2], NULL, 10);
printf("input1: %d, input2: %d\n", input1, input2);
if ((input1 > 1) || (input2 >= 100) || (input1 >= input2))
{
if(input1 > 1)
printf("input1 must be 1 or less!\n");
if(input2 >= 100)
printf("input2 must be 99 or less!\n");
if(input1 >= input2)
printf("input1 must be less than input2!\n");
return 1;
}
return 0;
}
您的要求是:
input1
必须小于2
input2
必须小于100
input1
必须小于input2
产量
$ gcc main.c -o main.exe; ./main.exe; Need Two! $ gcc main.c -o main.exe; ./main.exe -8 11; $ gcc main.c -o main.exe; ./main.exe 13 11; input1 must be 0 or less! input1 must be less than input2! $ gcc main.c -o main.exe; ./main.exe 0 100; input2 must be 99 or less! $ gcc main.c -o main.exe; ./main.exe -5 -10; input1 must be less than input2!
您在使用参数向量( argv )后检查参数计数( argc )...
好吧, 你可以这样做:
#include <stdio.h> // For printing output...
#include <stdlib.h> // For strtol()...
// Customized macro that prints errors...
#define ERROR(ERR) {\
fprintf(stderr, ERR);\
return 1;\
}
int main(int const argc, char * argv[])
{
char *inputs, *inputs2;
if (argc == 3)
{
int const input1 = strtol(argv[1], &inputs, 10);
int const input2 = strtol(argv[2], &inputs2, 10);
if ((*inputs | *inputs2) != '\0' || input1 > 1 || input2 >= 100 || input1 >= input2)
ERROR("You have passed invalid arguments")
}
else
ERROR("You have passed invalid arguments")
return 0;
}
当使用23 405运行程序时,它会执行而不会出现任何错误。
发布代码不是真正的代码给出return 1}
,语法错误。
假设这是一个发布故障并return 1;}
被编码:
代码缺少strtol()
和printf()
。
添加这些以避免未定义的行为:
#include <stdio.h>
#include <stdlib.h>
我怀疑代码因某些未定义的行为而死亡,并且没有打印出任何内容。 因此OP错误地假设成功。
其他问题应该报告“程序与23 405”也不完全正确:
传递无效指针
使用无效的argv[1]
调用strtol(argv[1], &inputs, 10)
是未定义的行为。 首先验证argv[]
。
if (argc < 3) {
printf("Error: too few arguments.\n");
return 1;
}
可能会丢失信息
strtol()
返回一个long
,而不是int
。
long input1= strtol(argv[1], &inputs, 10);
long input2= strtol(argv[2], &inputs, 10);
缺少和不正确的转换检测
char *end1;
char *end2;
long input1= strtol(argv[1], &end1, 10);
long input2= strtol(argv[2], &end2, 10);
if (argv[1] == end1 || argv[2] == end2) {
printf("Error: no conversion.");
return 1;
}
缺乏肯定的成功
为了帮助区分成功与未定义的行为,打印成功。
// add
printf("Success\n");
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.