繁体   English   中英

在C中检查cmd行参数

[英]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新手所以非常感谢任何帮助!

  1. 在使用之前argv[2]应该确保argc >= 3
  2. 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;
}

您的要求是:

  1. input1必须小于2
  2. input2必须小于100
  3. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM