我正在尝试创建一个程序,要求用户输入VALID整数作为命令参数。我已经尝试了所有我能想到的东西,但是我无法让它发挥作用。我已经完成了10个不同的功能,每个功能都要抓一个,因为我可以调整它来工作。
这就是我现在所拥有的......
int checkdigit(char *argv) {
int i = 0;
for(i = 0; i <= strlen(argv); i++) {
if (argv[i] >= 48 && argv[i] <= 57) {
i++;
} else {
printf("Not valid");
return 1;
}
}
return 0;
}
无论我给它什么,都会打印“无效”。
答案 0 :(得分:1)
在argv
中进行迭代时,您的情况有误。它应该是i<strlen(argv)
而不是i<=strlen(argv)
。还有两个i++
将跳过每个有效数字。
这是工作的
int checkdigit(char *argv) {
int i = 0;
for(i = 0; i<strlen(argv); i++) {
if (argv[i] >= 48 && argv[i] <= 57) {
continue;
} else {
printf("Not valid");
return 1;
}
}
}
还要确保正确拨打checkdigit()
。
答案 1 :(得分:0)
如果您通过argv
传递整数,为什么不使用atoi
?您所要做的就是验证您的参数以验证您确实传递了足够的参数。
atoi
函数接受const char*
参数并返回int
,这听起来与您正在寻找的完全相同。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
if (argc > 1) {
for (int i = 1; i < argc; ++i) {
printf("Digit: %d\n", atoi(argv[i]));
}
}
return EXIT_SUCCESS;
}
输入:
./a.out 1 a 4 hello 72
输出:
Digit: 1
Digit: 0
Digit: 4
Digit: 0
Digit: 72
更新:经过进一步研究,strtol
是您需要的功能。 atoi
does no error checking,C标准没有说明当atoi
返回错误时会发生什么,因此该函数不被认为是安全的,所以当我最初认为函数返回零时,它实际上是返回错误。
如果您可以访问strtonum
,那么该功能在我看到的内容中非常可靠。我自己无法访问它,因为它似乎只能在FreeBSD上使用。
如果您无权访问,strtol
是可行的方法。它需要一个const char*
作为输入,所以它确实接受了你正在寻找的东西的正确输入,以及一个结束指针和一个基础,以及成功和失败的it legitimately returns 0。它比使用atoi
至少going to be safer。
答案 2 :(得分:0)
在顶部添加#include <ctype.h>
后,我会以这种方式编写您的函数:
int checkdigit(char *argv) {
int i = 0;
for(i = 0; i<strlen(argv); i++) {
if( !isdigit(argv[i]) ) {
printf("Not valid");
return 1;
}
}
return 0;
}
这将具有可移植到非基于ASCII的代码页环境的优势,例如基于EBCDIC的IBM的System 39或OS / 400(在大多数本地情况下),字符'0' - '9'具有值0xF0到0xF9。