检查有效数字的命令行参数

时间:2018-04-15 21:27:57

标签: c

我正在尝试创建一个程序,要求用户输入VALID整数作为命令参数。我已经尝试了所有我能想到的东西,但是我无法让它发挥作用。我已经完成了10个不同的功能,每个功能都要抓一个,因为我可以调整它来工作。

这就是我现在所拥有的......

int checkdigit(char *argv) {
    int i = 0;
    for(i = 0; i <= strlen(argv); i++) {
        if (argv[i] >= 48 && argv[i] <= 57) {
            i++;
        } else {
            printf("Not valid");
            return 1;
        }
     }
     return 0;
}

无论我给它什么,都会打印“无效”。

3 个答案:

答案 0 :(得分:1)

argv中进行迭代时,您的情况有误。它应该是i<strlen(argv)而不是i<=strlen(argv)。还有两个i++将跳过每个有效数字。

这是工作的

int checkdigit(char *argv) {
        int i = 0;
        for(i = 0; i<strlen(argv); i++) {
                if (argv[i] >= 48 && argv[i] <= 57) {
                        continue;
                } else {
                        printf("Not valid");
                        return 1;
                }
        }
}

还要确保正确拨打checkdigit()

答案 1 :(得分:0)

如果您通过argv传递整数,为什么不使用atoi?您所要做的就是验证您的参数以验证您确实传递了足够的参数。

atoi函数接受const char*参数并返回int,这听起来与您正在寻找的完全相同。

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

int main(int argc, char *argv[])
{
    if (argc > 1) {
        for (int i = 1; i < argc; ++i) {
            printf("Digit: %d\n", atoi(argv[i]));
        }
    }

    return EXIT_SUCCESS;
}

输入:

./a.out 1 a 4 hello 72

输出:

Digit: 1
Digit: 0
Digit: 4
Digit: 0
Digit: 72

更新:经过进一步研究,strtol是您需要的功能。 atoi does no error checking,C标准没有说明当atoi返回错误时会发生什么,因此该函数不被认为是安全的,所以当我最初认为函数返回零时,它实际上是返回错误。

如果您可以访问strtonum,那么该功能在我看到的内容中非常可靠。我自己无法访问它,因为它似乎只能在FreeBSD上使用。

如果您无权访问,strtol是可行的方法。它需要一个const char*作为输入,所以它确实接受了你正在寻找的东西的正确输入,以及一个结束指针和一个基础,以及成功和失败的it legitimately returns 0。它比使用atoi至少going to be safer

答案 2 :(得分:0)

在顶部添加#include <ctype.h>后,我会以这种方式编写您的函数:

  int checkdigit(char *argv) {
     int i = 0;
     for(i = 0; i<strlen(argv); i++) {
        if( !isdigit(argv[i]) ) {
           printf("Not valid");
           return 1;
        }
     }
     return 0;
  }

这将具有可移植到非基于ASCII的代码页环境的优势,例如基于EBCDIC的IBM的System 39或OS / 400(在大多数本地情况下),字符'0' - '9'具有值0xF0到0xF9。