Sar*_*aya 16 c parameter-passing command-line-arguments
我希望用户传递两个参数或将其留空.例如:
./program 50 50
Run Code Online (Sandbox Code Playgroud)
要么
./program
Run Code Online (Sandbox Code Playgroud)
当我尝试使用时int main(int argc, char *argv[])
,我所做的第一件事就是改变char *argv[]
,int *argv[]
但它没有用.我想要的是用户只需输入0到100之间的两个整数.所以如果它不是两个整数那么它应该给出一个错误.
我有点想用类型给出错误(就像我以前在C#上编程的那样),但无论我输入什么,argv [1]都会一直是'char'类型.
所以我所做的就是
for (int i = 0; i <= 100; i++) {
//printf("%d", i);
if (argv[1] == i) {
argcheck++;
printf("1st one %d\n", i);
}
else if (argv[2] == i) {
argcheck++;
printf("2nd one %d\n", i);
}
Run Code Online (Sandbox Code Playgroud)
这不起作用.此外,它在编译时发出警告,但如果我改为argv
使用atoi(argv[1])
,那么它会产生分段错误(核心转储)错误.
我需要一种简单的方法来解决这个问题.
编辑:
所以我解决了atoi()
,它给出分段错误的原因是因为我在没有参数的情况下尝试使用null值.所以我通过添加额外的cond来修复它.但现在问题是,如果价值是让我们说的话
./program asd asd
Run Code Online (Sandbox Code Playgroud)
然后输出atoi(argv[1])
将是0.有没有办法改变这个值?
Lel*_*ran 29
不要使用atoi()
也不要使用strtol()
.atoi()
没有错误检查(正如你发现的那样!)并且strtol()
必须使用全局errno
变量进行错误检查,这意味着你必须设置errno
为0,然后调用strtol()
,然后errno
再次检查错误.更好的方法是使用sscanf()
,它还允许您从字符串解析任何基本类型,而不仅仅是整数,它可以让您读取花哨的格式(如十六进制).
例如,要从字符串解析整数"1435":
if (sscanf (argv[1], "%i", &intvar) != 1) {
fprintf(stderr, "error - not an integer");
}
Run Code Online (Sandbox Code Playgroud)
从字符串中解析单个字符"Z"
if (sscanf (argv[1], "%c", &charvar)!=1) {
fprintf(stderr, "error - not a char");
}
Run Code Online (Sandbox Code Playgroud)
从字符串解析浮点"3.1459"
if (sscanf (argv[1], "%f", &floatvar)!=1) {
fprintf(stderr, "error - not a float");
}
Run Code Online (Sandbox Code Playgroud)
从字符串解析大的无符号十六进制整数"0x332561"
if (sscanf (argv[1], "%xu", &uintvar)!=1) {
fprintf(stderr, "error - not a hex integer");
}
Run Code Online (Sandbox Code Playgroud)
如果您需要更多错误处理,请使用正则表达式库.
P.P*_*.P. 14
这样做:
int main(int argc, char*argv[])
{
long a,b;
if (argc > 2)
{
a = strtol(argv[1], NULL, 0);
b = strtol(argv[2], NULL, 0);
printf("%ld %ld", a,b);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)