2016-11-28 148 views
3

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

所有的命令行参数都是字符串。你可以使用'atoi()'将字符串转换为整数,而不需要检查错误,或者使用'strtol()'或它的一个亲属来准确敏感但非常[微妙的错误检查](http://stackoverflow.com/questions/14176123 /正确的用法 - 的 - 与strtol)。注意你的命令行显示了一个'<',这意味着shell试图使用下一个参数(例子中的'1'和's')给出的文件重定向标准输入,并删除'<'和命令行中的文件名。您应该简单地删除'<'符号。 –

回答

4

最简单的办法就是遍历argv[n] S和一个传递一个给他们strtol()或相似。然后,检查错误并做出决定。引述man page(重点煤矿)

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

[...]

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

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

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; 
} 
+0

我已经试过了。如果我这样做的话,它可以工作:program_name 7 g或program_name gh tz,但是如果我先输入一个字符/字符串,然后输入如下的数字,它将不起作用:program_name:yu 5.这就是我陷入困境的一点当我自己尝试时。 – Willi

+0

可否请您分享确切的测试案例... bcz代码应该工作 –

+0

,并更新当前解决方案的帖子 –

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

只是一个评论:不是一个答案

如果你要使用

program < arg1 arg2 

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

program arg1 arg2