[英]How to check if last command line argument is a valid digit - C programming
我正在尝试编写一个程序来检查文本文件,但也使用一个作为最后一个参数传递的数字。 我想做一些错误检查以确保最后一个参数是一个数字。
我不知道digit()
function 是什么,但无论这个 function 是什么,它都不会检查字符串argv[argc-1]
是否成功。 这是因为如果argv[argc-1]
不是数字字符串作为错误, atoi()
function 将返回零,但如果argv[argc-1]
为"0"
也将返回零。 要验证argv[argc-1]
是否为一位且只有一位,您需要:
argv[argc-1][1] == '\0'
);isdigit( argv[argc-1][0] )
)。这是最终的代码。
char *a = argv[argc-1];
if ( (a[1] != '\0') || !isdigit(a[0]) ) {
printf("No valid digit entered\n");
exit(1);
}
正如一些用户在下面提到的,我的原始答案有两个问题。
首先,我假设argv
中的字符串不能为空。 但是,如果像./program ""
这样调用程序,则argv[1]
将是一个空字符串。
出于演示目的,这是一个在stdout
中打印所有argv
字符串及其长度的程序。
/* program.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char **argv) {
for (int i = 0; i < argc; i++)
printf("strlen(\"%s\") = %zu\n", argv[i], strlen(argv[i]));
return EXIT_SUCCESS;
}
这里是 output,确认argv[1]
是一个空字符串。
$ gcc -Wall -std=c99 -o program program.c
$ ./program ""
strlen("./program") = 9
strlen("") = 0
$
第二个问题与isdigit()
function的用法有关。 根据手册(终端上的man isdigit
),传递给isdigit()
的参数必须是unsigned char
。
int isdigit(int c);
这些函数根据指定的语言环境检查c(必须具有无符号字符或EOF的值)是否属于某个字符class。
这是没有以下评论中提到的问题的最终解决方案。
char *a = argv[argc-1];
if ( !isdigit((unsigned char) a[0]) || (a[1] != '\0') ) {
printf("No valid digit entered\n");
exit(1);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.