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

     2023-02-16     106

关键词:

【中文标题】如何确保命令参数的每个字符都是十进制数字?【英文标题】:How to make sure each character of a command argument is a decimal digit? 【发布时间】:2020-05-29 19:14:03 【问题描述】:

我们必须编写一个代码来加密凯撒的密码。其中一个步骤是:您的程序不是打印提供的命令行参数,而是检查以确保该命令行参数的每个字符都是十进制数字(即,012等),如果其中任何一个不是,则在打印消息 Usage: ./caesar key 后终止。但是,如果参数仅由数字字符组成,您应该将该字符串(回想一下 argv 是一个字符串数组,即使这些字符串恰好看起来像数字)转换为实际整数,并打印出整数,如 via %iprintf。 下面的代码是我所拥有的,但它返回成功和错误。我该如何解决这个问题,以便程序检查命令行参数的每个字符是否都是数字? Code I have

【问题讨论】:

嗨,欢迎来到 SO。请花一分钟阅读how to ask 和how to create a minimal, reproducible example 嗨。你的问题的标题是“C++”。你的标签说“C”。这些是不同的语言。请选择一个。 请将您的代码复制到您的问题中,使用代码示例的 Markdown 语法(代码前后各有三个 ``` 的行。)图像 (1) 在移动设备上难以阅读(以及使用屏幕阅读器等的人),以及(2)更难复制到答案中。 【参考方案1】:

isdigit 应用于包含字符代码的int 但在执行isdigit(atoi(argv[1])) 时,您首先尝试将字符串转换为整数,所以这是错误的。如果你使用isdigit,这是对所有字符串的迭代。

atoi 在参数不是有效整数时默默返回 0,不要使用它。

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

除此之外,当argc 不是 2 时,您必须终止执行而不是继续执行。

【讨论】:

【参考方案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 个字符。

【讨论】:

【参考方案3】:

你可以用一种有效的方式来做这件事:

#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;

验证参数正确给出后,您可以安全地使用atoi()。考虑:

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

【讨论】:

You can safely use atoi() after validating the arguments are correctly given : 不,你错过了可能的溢出 @bruno 如果给参数一个溢出的整数,它显然会抛出不正确的输出。 不大于不小于不检查字符串是否代表整数^^ 请注意,您还认为空字符串或仅包含 - 的字符串是整数的有效表示 您错过了空字符串的情况。并且调用strlen然后迭代字符串意味着字符串被读取两次,并且转换第三次读取将完成,记住你说的高效方式 ^^

我如何确保十进制中有一定数量的数字(尾随零)

】我如何确保十进制中有一定数量的数字(尾随零)【英文标题】:Howcanimakesurethereisacertainamountofnumbersinadecimal(trailingzeros)【发布时间】:2018-01-0600:40:01【问题描述】:在我的网站上,有金额被回显。当我从金额中减去时,它会... 查看详情

mysql存储过程如何遍历字符串的每个字符,并把每个字符转换成int(假设都是数字字符)?

其实我就是想在存储过程中实现大整数的乘法,具体的算法参见http://blog.csdn.net/yeruby/article/details/12023733怎么把这个算法变成mysql存储过程?求大侠解答。参考技术A循环,每次循环截取一位转换追问这个我知道,可是要怎么写,... 查看详情

如何将两个每个 8 位的数组(二进制数字字符串组合成一个 16 位的单个字符串?(arduino,移位寄存器)

】如何将两个每个8位的数组(二进制数字字符串组合成一个16位的单个字符串?(arduino,移位寄存器)【英文标题】:HowdoIcombinetwoarraysof8bitseach(binarynumberstringsintoonesinglestringwith16bits?(arduino,shiftregisters)【发布时间】:2021-06-1719:56... 查看详情

如何将看起来像十六进制数字的字符串转换为php中的实际十六进制数字?

】如何将看起来像十六进制数字的字符串转换为php中的实际十六进制数字?【英文标题】:HowdoIconvertastringthatlookslikeahexnumbertoanactualhexnumberinphp?【发布时间】:2011-02-2110:25:00【问题描述】:我有一个类似于"7a"的字符串,... 查看详情

java - 如何添加 - 每个字符串数字的第三位数字[重复]

】java-如何添加-每个字符串数字的第三位数字[重复]【英文标题】:java-howtoadd-everyafter3rddigitofStringnumber[duplicate]【发布时间】:2018-09-2108:14:43【问题描述】:我有联系电话,我从字符串类型的参数中获取。StringpharmacyPhone="123456789"... 查看详情

确保所有模块具有相同参数的模式?

】确保所有模块具有相同参数的模式?【英文标题】:Patternforensuringallmoduleshavesameparameters?【发布时间】:2021-04-1310:50:52【问题描述】:我正在用Python编写具有以下架构的代码。基本上,它是一个模块化合成器,由“模块”元组... 查看详情

c语言如何把11位16进制字符串转成16进制数?

...转换后直接得到对应数字0~9,因此直接将这个数字转换为十进制即可:k=k*16+s[i]-'0'即将当前位转换为十进制elsek=k*16+s[i]-'a'+10//如果t>9,说明原字符为'a'~'f',转换后不能得到对应数字,必须通过s[i]-'a&... 查看详情

从命令行接受多个数字求和后输出结果

程序:从命令行接收多个数字,求和之后输出结果(将命令行参数由字符串转化成数字)一.设计思想   命令行参数都是字符串,利用强制转换将字符串转化成数字才能相加。强制转换:lnteger.parselnt()二.程序流程图&nbs... 查看详情

linux系统shell工具打印输出

...对齐。  整形:  %d:整数的参数会被转成一有符号的十进制数字  %u:整数的参数会被转成一无符号的十进制数字  %o:整数的参数会被转成一无符号的八进制数字  %x:整数的参数会被转成一无符号的十六进制数字,并以... 查看详情

命令行参数,多数相加

题目要求:1编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。     2命令行参数都是字符串,必须先将其转化为数字,才能相加。设计思想:         没有规定... 查看详情

用于对字符串向量进行排序的比较函数(每个字符串都是一个数字)C++

】用于对字符串向量进行排序的比较函数(每个字符串都是一个数字)C++【英文标题】:Comparefunctionforsortingvectorofstrings(eachstringisanumber)C++【发布时间】:2013-08-2114:58:47【问题描述】:我正在尝试使用以下比较函数对vector&lt;str... 查看详情

如何转义任意字符串以用作 Bash 中的命令行参数?

】如何转义任意字符串以用作Bash中的命令行参数?【英文标题】:HowcanIescapeanarbitrarystringforuseasacommandlineargumentinBash?【发布时间】:2011-09-1211:29:36【问题描述】:我有一个字符串列表,我想在单个Bash命令行调用中将这些字符串... 查看详情

printf格式,参数

...;",<参量表>);其中格式化字符串包括两部分内容:%d十进制有符号整数d,lx,ld,,lu,这几个都是输出32位的hd,hx,hu,这几个都是输出16位数据的,hhd,hhx,hhu,这几个都是输出8位的,lld,ll,llu,llx,这几个都是输出64... 查看详情

如何将一串二进制数转换为 C 中的字符(每个字符都必须有一个半字节)?

】如何将一串二进制数转换为C中的字符(每个字符都必须有一个半字节)?【英文标题】:HowcanIconvertastringofbinarynumbersintocharactersinC(eachcharacterhastohaveanibble)?【发布时间】:2021-09-0115:11:03【问题描述】:我已经寻找了有用的函数... 查看详情

我有很多字节数组;每个都是一个字符串。我如何找到每个使用的编码?(代码片段)

我有一个从数据库中读取二进制数据的应用程序。检索的每个字节数组表示一个字符串但是,字符串都来自不同的编码(最常见的是ASCII,UTF-8BOM和UTF-16LE,但还有其他编码)。在我自己的应用程序中,我正在尝试将字节数组转换... 查看详情

输入多个整数求和

一思路:1定义一个变量sum。2用字符串存储参数命令行参数都是字符串3将字符串转化为数字,相加。4输出和。关键:命令行参数都是字符串,转化为数字。二:流程图   三:源代码publicclassCommandParameter{  publics... 查看详情

haslib模块

...  (不可逆)  得到的结果是一个32位的字符串,且每个字符串都是一个十六进制的数字。  效率快,相对简单。 查看详情

查询长度未知时如何向查询添加参数

】查询长度未知时如何向查询添加参数【英文标题】:Howtoaddparameterstoaquerywhenqueryisunknownlength【发布时间】:2020-04-1301:17:50【问题描述】:我正在处理一个需要将多行添加到MySQL表的项目,由于连接的高延迟,我试图在一个命令... 查看详情