如何检查最后一个命令行参数是否是有效的数字- C编程



我正试图编写一个程序,将检查文本文件,但也使用一个数字,这是最后一个参数传递。我想做一些错误检查,以确保最后一个参数是数字。

ORIGINAL

我不知道digit()函数是什么,但是不管这个函数是什么,它永远不会检查字符串argv[argc-1]是否成功是一个数字。这是因为如果argv[argc-1]不是一个数字字符串作为错误,atoi()函数将返回零,但如果argv[argc-1]"0",也将返回零。要验证argv[argc-1]是否为一个且只有一个数字,您需要:

  1. 检查字符串(argv[argc-1][1] == '')的长度;
  2. 检查第一个字符是否为数字字符(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);
}

最新更新