如何检查命令行参数是否为整数

时间:2016-11-28 05:45:39

标签: c parsing command-line-arguments c89

首先,我说的是用gcc编译的老式ANSI-C(我的意思是ANSI标准,没有C99或更新)。我只允许使用代码中可以看到的库。

我的问题是我在终端上有一个以下列方式调用的程序:

program < integer_1 integer_2

虽然我已经能够弄清楚如何检查参数的数量,但我仍然坚持检查它们是否是整数。 如果程序被调用如下:

program < 1 -13

它应该在没有抱怨的情况下运行,但如果它是这样运行的:

program < s 7

它应该抛出错误。

到目前为止,无论我做了什么,都是彻头彻尾的垃圾。到目前为止我管理的最好的事情是如果第二个数字是一个字符的错误信息。我的尝试都没有能够处理多个数字,但我已经找到了原因。

问题是我现在没有使用任何编程语言的命令行/终端参数(C ++,Java)。我真的很感激,如果有人能告诉我如何检查正确的输入,坦率地说我没有想法。

我是否正确如果我想处理大于9的数字,我必须从索引2开始迭代argv直到找到空格?

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main(int arc, char *argv[])
{
  if(arc != 3)
  {
    printf("Error: You have entered %d arguments, but two were expected!", arc - 1);
    return -1;
  }

  return 0;
}

4 个答案:

答案 0 :(得分:4)

最简单的方法是迭代argv[n]并逐个传递给strtol()或类似。然后,检查错误并做出决定。引用man page(强调我的)

  

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

     

[...]

     

如果endptr不是NULLstrtol()会将第一个无效字符的地址存储在*endptr中。如果根本没有数字,strtol()会将nptr的原始值存储在*endptr中(并返回0)。 特别是,如果*nptr不是'\0'但返回时**endptr'\0',则整个字符串都有效。

尽管如此,program < integer_1 integer_2并不完全是传递命令行参数的方法。如果要将values参数作为命令行参数传递,则应丢失重定向运算符并直接使用argcargv[n] ..

答案 1 :(得分:0)

最好的方法是创建一个函数来检查它是否为数字。如果下面的函数返回true,则使用atoi(argv [])将它们转换为整数以进一步使用它。

bool isNumber(char number[])
{
    int i = 0;

    //checking for negative numbers
    if (number[0] == '-')
        i = 1;
    for (; number[i] != 0; i++)
    {
        //if (number[i] > '9' || number[i] < '0')
        if (!isdigit(number[i]))
            return false;
    }
    return true;
}

答案 2 :(得分:0)

您可以尝试这样的事情:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int check_cmd_args(char const *str[], int numargs);

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

    if (argc < 2) {
        printf("Not enough command line arguements entered\n");
        exit(EXIT_FAILURE);
    }

    if (check_cmd_args(argv, argc)) {
        printf("All Command line arguements are integers\n");
    } else {
        printf("Error, non-integer command line arguement entered\n");
    }

    return 0;
}

int
check_cmd_args(char const *str[], int numargs) {
    int n, i = 0;

    for (n = 1; n < numargs; n++) {
        if (str[n][0] == '-') {
            i = 1;
        }
        for (; str[n][i]; i++) {
            if (!isdigit(str[n][i])) {
                return 0;
            }
        }
    }
    return 1;
}

答案 3 :(得分:0)

只是评论:不是答案

如果您打算使用

program < arg1 arg2

您不会在主参数中看到arg1或arg2。 arg1通常是包含将由程序读取的数据的文件名或设备。我不知道该程序是否能够访问arg2。如果您想获取arg1 arg2等,请丢失&lt;

program arg1 arg2