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

Posted

技术标签:

【中文标题】如何检查命令行参数是不是为整数【英文标题】:How to check if command line parameters are integers如何检查命令行参数是否为整数 【发布时间】:2017-04-11 19:04:08 【问题描述】:

首先,我说的是用 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;

【问题讨论】:

所有命令行参数都是字符串。您可以使用atoi() 将字符串转换为整数,而无需进行错误检查,或者使用strtol() 或其亲属之一,准确且敏感但非常delicate error checking。请注意,您的命令行显示&lt;,这意味着shell 尝试从具有下一个参数(示例中的1s)给出的名称的文件重定向标准输入,并删除&lt;和命令行中的文件名。您应该简单地删除 &lt; 符号。 【参考方案1】:

最简单的方法是遍历argv[n]s 并将它们一一传递给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 &lt; integer_1 integer_2 并不完全是传递命令行参数的方式。如果您想将值参数作为命令行参数传递,您将失去重定向运算符并直接使用argcargv[n]s..

【讨论】:

【参考方案2】:

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

【讨论】:

我已经试过了。如果我这样做,它会起作用:program_name 7 g 或 program_name gh tz,但如果我先输入一个字符/字符串然后输入这样的数字,它就不起作用:program_name: yu 5。这就是我卡住的地方当我自己尝试时。 能否请您分享确切的测试用例... bcz 代码应该可以工作 不再需要该程序。但我仍然有兴趣弄清楚这些东西。因此,我将尝试在本周末发布一个可行的解决方案。很抱歉回复晚了。我现在很忙。【参考方案3】:

只是评论:不是答案

如果你要使用

program < arg1 arg2

您不会在主要参数中看到 arg1 或 arg2。 arg1 通常是一个文件名或设备,其中包含程序将读取的数据。我不知道该程序是否甚至可以访问 arg2。如果您想拿起 arg1 arg2 等,请丢失

program arg1 arg2

【讨论】:

【参考方案4】:

你可以试试这样的:

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

【讨论】:

以上是关于如何检查命令行参数是不是为整数的主要内容,如果未能解决你的问题,请参考以下文章

创建一个shell,检查命令行参数个数,如果参数不是三个,则显示一条错误信息

如何将整数作为命令行参数?

如何检查“.bat”文件中的命令行参数?

Windows批处理文件:如何将命令行参数与整数进行比较

如何检查并引发没有命令行参数的错误

Java:检查命令行参数是否为null