首页 > 解决方案 > 如何检查最后一个命令行参数是否为有效数字 - C 编程

问题描述

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

标签: ccommand-line-arguments

解决方案


原来的

我不知道digit()这个函数是什么,但不管这个函数是什么,它永远不会检查字符串argv[argc-1]是否成功。这是因为atoi()如果 is 不是数字字符串,该函数将返回零argv[argc-1]作为错误,但如果argv[argc-1]is也将返回零"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;
}

这是输出,确认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);

这些函数根据指定的语言环境检查必须具有 unsigned char 或 EOF 值的 c 是否属于某个字符类。

这是没有以下评论中提到的问题的最终解决方案。

char *a = argv[argc-1];
if ( !isdigit((unsigned char) a[0]) || (a[1] != '\0') ) {
    printf("No valid digit entered\n");
    exit(1);
}

推荐阅读