如何检查 argv[count] 是否为整数

How to check if argv[count] is an integer

我正在尝试用 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++;
    }
...
}

现在这段代码正确地捕获了这个输入中的错误:

但在此输入格式下失败

我试图通过尝试使用 sprintf 进行比较来解决这个问题。不幸的是,为 sprintf 提供 char 数组指针只会在 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);

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

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

下面是方便的单行...

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

...如果可以读入 int n 并且之后没有尾随字符,则计算结果为真。 %*c 中的 '*' 禁止赋值,因此无需传递指向虚拟 char 变量的指针。参见 scanf docs here

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

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