关键词:
【中文标题】如何确保命令参数的每个字符都是十进制数字?【英文标题】:How to make sure each character of a command argument is a decimal digit? 【发布时间】:2020-05-29 19:14:03 【问题描述】:我们必须编写一个代码来加密凯撒的密码。其中一个步骤是:您的程序不是打印提供的命令行参数,而是检查以确保该命令行参数的每个字符都是十进制数字(即,0
、1
、2
等),如果其中任何一个不是,则在打印消息 Usage: ./caesar key 后终止。但是,如果参数仅由数字字符组成,您应该将该字符串(回想一下 argv
是一个字符串数组,即使这些字符串恰好看起来像数字)转换为实际整数,并打印出整数,如 via %i
和 printf
。
下面的代码是我所拥有的,但它返回成功和错误。我该如何解决这个问题,以便程序检查命令行参数的每个字符是否都是数字?
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<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表的项目,由于连接的高延迟,我试图在一个命令... 查看详情