【问题标题】:Check if a command line argument is an integer检查命令行参数是否为整数
【发布时间】:2019-08-25 22:27:29
【问题描述】:

我必须检查给定的参数是否为整数。我不能使用 [] 和内存分配,我尝试使用 isdigit();但它不适合我。 感谢您的任何建议和帮助。

int main(int argc, char *argv[]) {

    int sum=0, i;

    if(argc<2)
    {
        printf("Not enough arguments");
        return 9;
    }
    for (i=1; i<argc; i++)
    {
        if (!isdigit(atoi(*(argv+i))))
        {
            printf("Incorrect input");
            return 1;
        }
    }   
    for(i=1; i<argc; i++)
    {
        sum+=atoi(*(argv+i));
    }

    printf("%d", sum);

    return 0;
}

如果其中一个数字不是整数,它应该显示“输入错误”并返回 1,但是当我使用 isdigit 时,即使所有数字都是整数,每次程序都会打印“输入错误”。

【问题讨论】:

  • isdigit 作用于字符。您应该在调用atoi()之前调用它(因为您不想使用非数字字符调用atoi())。
  • 使用strtol 进行转换,验证是内置的。
  • 另外,对于任何指针或数组p 和索引i,表达式*(p + 1)完全等于p[i]。后者通常更容易阅读和理解,而且写起来也少一些。

标签: c validation command-line-arguments


【解决方案1】:

检查给定参数是否为整数。

使用strto*() 系列函数。 @Some programmer dude

示例:测试是否int?

bool is_int(const char *arg) {
  char *endptr;
  errno = 0;
  long value = strtol(arg, &endptr, 10);

  // Various tests, adjust as desired.

  if (arg == endptr) return false; // no conversion occurred.
  if (errno == ERANGE) return false; // outside `long` range
  if (value > INT_MAX || value < INT_MIN) return false; // outside `int` range
  if (*endptr != '\0') return false; // Extra junk at end

  return true;
}



  for (i=1; i<argc; i++) {
    if (!is_int(argv+i)) {
      printf("Incorrect input\n");
      return 1;
    }
  } 

研究strtol()了解更多详情。


如果任何整数都可以,即使是大整数,也可以简单地寻找一个可选的符号,后跟数字。

bool is_integer(const char *arg) {
  if (*arg == '-' || *arg == '+') arg++;

  bool digit_found = false;
  while (isdigit((unsigned char) *arg)) {
     arg++;
     digit_found = true;
  }

  return *arg == '\0' && digit_found;
}

atoi(*(argv+i)) 应生成警告。启用所有警告以节省时间。 atoi() 需要一个指向字符串的指针。

【讨论】:

  • 非常感谢,它有帮助,现在一切正常
猜你喜欢
  • 2015-05-28
  • 2017-04-11
  • 2016-02-09
  • 2011-04-21
  • 2016-04-15
  • 2016-12-28
  • 2015-04-12
  • 1970-01-01
相关资源
最近更新 更多