【问题标题】:Checking That Only Digits are Used in a Command-line Argument检查命令行参数中是否仅使用数字
【发布时间】:2021-02-11 20:21:58
【问题描述】:

我正在开发一个接受一个命令行参数的程序,我只希望它接受数字。我希望它返回 1 并打印“Usage: ./caesar key”,如果有任何不是数字的东西,例如,如果用户在命令行中输入 20x 而不是 20。我已经为它创建了一个代码但发现即使命令行参数仅包含数字,它也会返回 1 并打印“Usage: ./caesar key”。有人对如何解决这个问题有一些建议吗?

    for (int i = 0, len = strlen(argv[1]); i < len; i++)
    {
        if (isdigit((char)argv[i]) == false)
        {
            printf("Usage: ./caesar key");
            printf("\n");
            return 1;
        }
        else
        {
            printf("success");
        }
    }

【问题讨论】:

  • 试试isdigit((char)argv[i]) --> isdigit(argv[1][i])
  • @chux-ReinstateMonica 谢谢我对命令行参数和数组还很陌生,所以我整天都被困在这个问题上。这似乎已经解决了!
  • 现在很清楚为什么它会修复问题?
  • 但是isdigit(argv[1][i]) 只检查参数的第一个字符而不是全部,不是吗?
  • @JerryJeremiah 是的 - 只有 1 个字符

标签: c


【解决方案1】:
  1. isdigit 的返回值是一个整数,而不是一个 布尔值,因此您可能无法获得合适的结果 比较。在某些情况下,返回值可以像布尔值一样使用 方式,但不用于直接的价值比较。你不需要 无论如何,在 C 中直接进行值比较,所以只需从代码中删除 == false 并将 ! 放在 isdigit 前面就是 最好的东西。

  2. 如果您从 argv[i] 中删除了 (char) 演员表,那么 编译器会告诉您您正在使用指针作为整数 没有演员表。这是因为 argv 是一个指针数组(种类 在它的使用中就像一个二维数组,但有一些 差异)。当您仅索引此值一次时,您会得到一个 指针必须再次被索引以获得你的字符 传入isdigit。保持这一点的一个有用方法是 声明一个您设置为等于argv[1]const char * 变量 在你的循环之前,然后在循环中使用它而不是担心 关于直接使用 argv 的额外内容。

  3. 您没有处理argv[1]"" 的情况或 NULL(尽管您之前可能已经完成了 NULL 测试)。

  4. 因为你要循环遍历字符串 (char[]) 无论如何,strlen 必须遍历字符串才能找到结尾, 你可以改变整个循环不知道它的界限在前面和 只需检查'\0',然后进行isdigit 测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-15
    • 2015-05-28
    • 2011-04-21
    • 2017-04-11
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多