繁体   English   中英

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

[英]How to check if command line parameters are integers

首先,我在谈论用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;
}

最简单的方法是遍历argv[n]并逐个传递给strtol()或类似的东西。 然后,检查错误并做出决定。 引用手册页(强调我的)

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

[...]

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

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

最好的方法是创建一个函数来检查它是否为数字。如果下面的函数返回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;
}

你可以尝试这样的事情:

#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;
}

只是评论:不是答案

如果你要使用

program < arg1 arg2

您不会在主参数中看到arg1或arg2。 arg1通常是包含将由程序读取的数据的文件名或设备。 我不知道该程序是否能够访问arg2。 如果你想拿起arg1 arg2等,就输掉<

program arg1 arg2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM