我正试图编写一个程序,将检查文本文件,但也使用一个数字,这是最后一个参数传递。我想做一些错误检查,以确保最后一个参数是数字。
ORIGINAL
我不知道digit()
函数是什么,但是不管这个函数是什么,它永远不会检查字符串argv[argc-1]
是否成功是一个数字。这是因为如果argv[argc-1]
不是一个数字字符串作为错误,atoi()
函数将返回零,但如果argv[argc-1]
是"0"
,也将返回零。要验证argv[argc-1]
是否为一个且只有一个数字,您需要:
- 检查字符串(
argv[argc-1][1] == ' '
)的长度; - 检查第一个字符是否为数字字符(
isdigit( argv[argc-1][0] )
)
这是最后的代码。
char *a = argv[argc-1];
if ( (a[1] != ' ') || !isdigit(a[0]) ) {
printf("No valid digit enteredn");
exit(1);
}
编辑# 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") = %zun", argv[i], strlen(argv[i]));
return EXIT_SUCCESS;
}
下面是输出,确认argv[1]
是一个空字符串。
$ gcc -Wall -std=c99 -o program program.c
$ ./program ""
strlen("./program") = 9
strlen("") = 0
$
第二个问题与isdigit()
函数的使用有关。根据手册(man isdigit
在终端),传递给isdigit()
的参数必须是unsigned char
。
int isdigit(int c);
这些函数检查c是否有an的值unsigned char(无符号字符)或EOF,根据它属于某个字符类到指定的区域设置。
这是没有下面评论中提到的问题的最终解决方案。
char *a = argv[argc-1];
if ( !isdigit((unsigned char) a[0]) || (a[1] != ' ') ) {
printf("No valid digit enteredn");
exit(1);
}