繁体   English   中英

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

[英]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]是否为一位且只有一位,您需要:

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

编辑#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM