如何检查命令行参数是不是为整数
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。请注意,您的命令行显示<
,这意味着shell 尝试从具有下一个参数(示例中的1
和s
)给出的名称的文件重定向标准输入,并删除<
和命令行中的文件名。您应该简单地删除 <
符号。
【参考方案1】:
最简单的方法是遍历argv[n]
s 并将它们一一传递给strtol()
或类似的。然后,检查错误并做出决定。引用man page,(强调我的)
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
并不完全是传递命令行参数的方式。如果您想将值参数作为命令行参数传递,您将失去重定向运算符并直接使用argc
和argv[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;
【讨论】:
以上是关于如何检查命令行参数是不是为整数的主要内容,如果未能解决你的问题,请参考以下文章