2015-05-20 56 views
5

我想在C++中创建一个命令行应用程序,我想确保输入是某个命令参数后的整数。如何检查是否argv [count]是一个整数

对于这个例子,我想检查下一个参数是否是“-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”

+8

选择一种语言。你说C++,但是你使用C习语,并且问题用两者来标记。 –

+1

['isdigit'](http://www.cplusplus.com/reference/cctype/isdigit/) – 101010

+0

使用'strcmp'来比较两个字符串,而不是'!='。你可以使用'if(isdigit(argv [count]))'来检查参数是否是数字。 –

回答

13

atoi()不能做你想做的。您需要使用strtol()来实现此目的。它的错误检查能力大大提高。

签名:

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

该函数返回经转换的整数作为长整型值,则返回其他零值。 转换后,您可以检查endptr的内容并作出决定。

+1

注意:'endptr'将被设置为指向数字后的第一个字符,所以如果数字是一个有效的整数,它应该指向一个结束字符串的空终止符。换句话说,要检查转换是否成功,请执行'if(* endptr == 0)' – szczurcio

+0

您可以使用函数返回值来决定。 – ANjaNA

+2

@ANjaNA - 不,您不能使用返回值来确定转换是否失败,因为转换失败时的返回值也是转换成功的可能结果。你**必须**使用'endptr'的值。 –

0

您也可以使用C++ 11替代品,这些替代品是用strtol(见stol)实现的。

+0

这不值得downvotes,因为它被张贴,而问题也被标记为C++ .... –

3

下面是一个方便的一行...

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

...如果它是可以读入int n并没有尾随字符后,将评估真实。 %*c中的'*'会取消赋值,因此不需要将指针传递给虚拟变量char。请参阅scanf docs here

+0

我试过这个,它是一样的上述问题。与那些以下输入一起工作,但在捕获“-p 17ss”输入错误时失败 – MDuh

+0

@MDuh:它如何“失败”? - 你可以看到[这里](http://ideone.com/fiMTbo)带有该文本的'sscanf'如何根据上面的'== 1'测试返回'0'...这意味着它发现了错误。当它返回正好1时,输入有效并且'n'将被设置为其数值。 –

+0

为了更明确一点,对于你特定的用例,你需要'if(sscanf(argv [count + 1],“%d%* c”,&pid)!= 1){err = 1; cout <<“pid参数不是有效的输入”<< endl; pid = -1; ''等等... –

1

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

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