如何检查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替代方法。