C 如何确保命令参数的每个字符都是十进制数字?

C 如何确保命令参数的每个字符都是十进制数字?,c,command-line-arguments,digits,atoi,C,Command Line Arguments,Digits,Atoi,我们必须做一个密码来加密凯撒的密码。其中一个步骤是:您的程序不打印提供的命令行参数,而是检查以确保该命令行参数的每个字符都是十进制数字,即0、1、2等,如果其中任何一个不是十进制数字,则在打印消息Usage:./caesar key后终止。但是,如果参数仅由数字字符组成,则应将该字符串转换为字符串数组,即argv是字符串数组,即使这些字符串恰好看起来像数字,也应将其转换为实际整数,并通过%i和printf打印出整数。 下面的代码就是我的代码,但它同时返回Success和Error。如何修复此问题

我们必须做一个密码来加密凯撒的密码。其中一个步骤是:您的程序不打印提供的命令行参数,而是检查以确保该命令行参数的每个字符都是十进制数字,即0、1、2等,如果其中任何一个不是十进制数字,则在打印消息Usage:./caesar key后终止。但是,如果参数仅由数字字符组成,则应将该字符串转换为字符串数组,即argv是字符串数组,即使这些字符串恰好看起来像数字,也应将其转换为实际整数,并通过%i和printf打印出整数。 下面的代码就是我的代码,但它同时返回Success和Error。如何修复此问题,以便程序检查命令行参数的每个字符是否为数字?

isdigit应用于包含字符代码的整数,但执行isdigitatoiargv[1]时,您首先尝试将字符串转换为整数,因此这是错误的。如果您使用isdigit,这是对所有字符串的迭代

atoi在参数不是有效整数时以静默方式返回0,请不要使用它

这并不是因为字符串只包含可以获取相应整数的数字,因为该数字对于整数来说可能太大。如果接受负数,则第一个字符可以是-而不是数字。转换和检查所有表示有效整数的字符串的一种方法是使用strtol返回long


如果argc不是2,则必须终止执行,而不是继续执行。

以下是一种检查字符串中所有字符是否在给定集合中的简单方法:

#include <string.h>

int main(int argc, char *argv[]) {
    if (argc > 1) {
        if (strspn(argv[1], "0123456789") == strlen(argv[1]))
            printf("OK\n");
        else
            printf("Invalid characters\n");
    }
    return 0;
}

您可能需要检查命令行参数是否至少有1个字符。

您可以高效地执行此操作:

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

bool isNumber(char number[])
{
    int i = 0;

    if (strlen(number) == 0) // checks for empty string
        return false;

    if (strlen(number) == 1 && number[0] == '-') // checks for invalid str with negation sign
        return false;

    if (number[0] == '-') // verifies negation sign
        i = 1;

    for (; number[i] != 0; i++)
        if (!isdigit(number[i]))
            return false; // if not a number

    return true; // if number
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("Usage: ./caesar key\n");
        return -1;
    }

    if (isNumber(argv[1]))
        printf("%d\n", atoi(argv[1])); // ... statements
    else
        printf("Usage: ./caesar key\n");

    return 0;
}
样本输出
嗨,欢迎来到苏。请花一分钟读一读,你好。你的问题题目是C++。你的标签上写着C。这是不同的语言。请选择一个。请将您的代码复制到您的问题中,使用代码示例的标记语法,在代码前后各有三个“``”。图像1在移动设备上和使用屏幕阅读器的人中很难阅读,2更难复制到答案中。在验证参数是否正确后,您可以安全地使用atoi:不,您错过了可能的答案overflow@bruno如果参数是一个溢出整数,它显然会抛出错误的输出。不超过或不检查字符串表示整数^ ^注意,你也考虑一个空字符串或只包含字符串-是一个无效的空字符串的情况下的整数的有效表示。调用strlen然后对字符串进行迭代意味着该字符串被读取两次,然后转换第三次读取,还记得你说过的高效方法吗^^
if (isNumber(argv[1]))
    printf("Go on\n");
else
    printf("Usage: ./caesar key\n");
$ ./caesar
Usage: ./caesar key
$ ./caesar s
Usage: ./caesar key
$ ./caesar 123 // --- right one
123
$ ./caesar s 3 f
Usage: ./caesar key