如何检查argv 是否为整数

我正在尝试用C ++创建一个命令行应用程序,我想确保在某个命令参数之后输入是一个整数。

对于此示例,我想检查下一个参数是否是“-p”命令参数后面的整数。 这是我现在代码的片段。

while (count < argc){ if (strcmp("-p", argv[count]) == 0){ has_p = true; //Boolean pid = atoi(argv[count + 1]); if (pid == 0 && argv[count + 1] != "0" ){ err = 1; cout << "pid argument is not a valid input" << endl; pid = -1; } count++; } ... } 

现在,此代码正确捕获此输入中的错误:

  • -p 1777
  • -p sss
  • -p sss17
  • -p [空格] -U

但是输入格式失败了

  • -p 17sss

我试图通过使用sprintf来比较它来解决这个问题。 不幸的是,使用char数组指针提供sprintf只会在buffer2中输出1个字符。

 while (count < argc){ if (strcmp("-p", argv[count]) == 0){ has_p = true; //Boolean pid = atoi(argv[count + 1]); sprintf(buffer, "%d", pid); sprintf(buffer2, "%d", *argv[count + 1]); if (pid == 0 && argv[count + 1] != "0" || (buffer != buffer2) ){ err = 1; cout << "pid argument is not a valid input" << endl; pid = -1; } count++; } ... } 

有没有办法让sprintf读取整个char数组? 如果没有,除了循环指针直到我点击“\ 0”之外,是否有更好的解决方案

atoi()无法做你想做的事。 您需要使用strtol()来实现此目的。 它有很多改进的错误检查能力。

签名:

 long int strtol(const char *nptr, char **endptr, int base); 

此函数将转换后的整数作为long int值返回,否则返回零值。 转换后,您可以检查endptr的内容并做出决定。

以下是一个方便的单行…

 sscanf(argv[count + 1], "%d%*c", &n) == 1 

…如果可以读入int n并且之后没有尾随字符,那么将评估为true。 %*c的’*’禁止赋值,因此不需要将指针传递给虚拟char变量。 请在此处查看scanf文档 。

在C中,您可以简单地浏览char *并检查是否只有数字。

 char c = '0'; int i = 0; int err = 0 while ( c != '\0'){ if (arg[i] < 47 || arg[i] > 57){ err = 1; break; } 

您还可以使用以strtol(参见stol )实现的c ++ 11替代方法。