【问题标题】:Checking command line argument for valid digit检查有效数字的命令行参数
【发布时间】:2018-04-15 21:27:56
【问题描述】:

我正在尝试创建一个要求用户输入有效整数作为命令参数的程序。我已经尝试了所有我能想到的东西,但我无法让它发挥作用。我经历了大概 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;
}

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

【问题讨论】:

  • 您正在跳过每个有效数字后的每个字符。
  • 有两个i++删除一个。
  • 从你的参数名称来看,你可能误解了使用命令行参数的整个概念。看看这里stackoverflow.com/a/47536091/7733418
  • 不要使用像 48 和 57 这样的“幻数”,这会使代码更难阅读。请改用正确的字符常量:if(argv[i] &gt;= '0' &amp;&amp; argv[i] &lt;= '9')。如果 for 循环中的条件是&lt;= strlen(argv),那么您将读取'\0'-终止字节。正确的条件应该是&lt; strlen(argv).#

标签: c


【解决方案1】:

argv 中迭代时,您的条件有误。它应该是i&lt;strlen(argv) 而不是i&lt;=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()

【讨论】:

    【解决方案2】:

    如果您通过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。至少going to be safer 比使用atoi

    【讨论】:

      【解决方案3】:

      在顶部添加#include &lt;ctype.h&gt; 后,我会这样写你的函数:

        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 系统 39 或 OS/400(在大多数本机情况下),并且字符 '0'-'9' 的值从 0xF0 到0xF9。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-16
        • 2016-05-31
        • 1970-01-01
        • 1970-01-01
        • 2017-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多