C 如何确保命令参数的每个字符都是十进制数字?
我们必须做一个密码来加密凯撒的密码。其中一个步骤是:您的程序不打印提供的命令行参数,而是检查以确保该命令行参数的每个字符都是十进制数字,即0、1、2等,如果其中任何一个不是十进制数字,则在打印消息Usage:./caesar key后终止。但是,如果参数仅由数字字符组成,则应将该字符串转换为字符串数组,即argv是字符串数组,即使这些字符串恰好看起来像数字,也应将其转换为实际整数,并通过%i和printf打印出整数。 下面的代码就是我的代码,但它同时返回Success和Error。如何修复此问题,以便程序检查命令行参数的每个字符是否为数字? isdigit应用于包含字符代码的整数,但执行isdigitatoiargv[1]时,您首先尝试将字符串转换为整数,因此这是错误的。如果您使用isdigit,这是对所有字符串的迭代 atoi在参数不是有效整数时以静默方式返回0,请不要使用它 这并不是因为字符串只包含可以获取相应整数的数字,因为该数字对于整数来说可能太大。如果接受负数,则第一个字符可以是-而不是数字。转换和检查所有表示有效整数的字符串的一种方法是使用strtol返回longC 如何确保命令参数的每个字符都是十进制数字?,c,command-line-arguments,digits,atoi,C,Command Line Arguments,Digits,Atoi,我们必须做一个密码来加密凯撒的密码。其中一个步骤是:您的程序不打印提供的命令行参数,而是检查以确保该命令行参数的每个字符都是十进制数字,即0、1、2等,如果其中任何一个不是十进制数字,则在打印消息Usage:./caesar key后终止。但是,如果参数仅由数字字符组成,则应将该字符串转换为字符串数组,即argv是字符串数组,即使这些字符串恰好看起来像数字,也应将其转换为实际整数,并通过%i和printf打印出整数。 下面的代码就是我的代码,但它同时返回Success和Error。如何修复此问题
如果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