如何在C中解析整数命令行参数?

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)

如果您需要更多错误处理,请使用正则表达式库.

  • 您可以使用`strtol()`的第二个参数(结束指针)进行错误检查,而不涉及`errno`. (2认同)

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)


unw*_*ind 5

参数总是作为字符串传递,你不能改变原型main().操作系统和周围的机器总是传递字符串,并且无法弄清楚你是否已经改变它.

您需要使用eg strtol()将字符串转换为整数.