C使用isdigit检查optarg是否为数字

时间:2017-09-14 00:45:10

标签: c getopt atoi

如果optarg(来自Getop库的标志-s之后的参数)不是数字,我想要打印错误消息并终止程序,如果是数字,则需要设置大小去optarg。我遇到的问题是,当-s r之类的命令会出现错误消息时,-s 2也会出现,这意味着它将2解释为字符串。

使用for -s 2进行调试

#1 printf("%d",atoi(optarg));
#2 printf("%d",isdigit(atoi(optarg)));

我得到第1行的int值2, 第2行的int值为0。

所以我想知道为什么isdigit(atoi(optarg)))给我一个0,当atoi(optarg)给我一个int。有没有更好的方法来检查optarg是否为int?

int main (int argc, char *argv[]){


int size;
char option;
size = 0;
const char *optstring;
optstring = "rs:pih";

 while ((option = getopt(argc, argv, optstring)) != EOF) {
    switch (option) {
        case 'r':
            type_set = 1;
            break;
        **case 's':
            capacity_set = 1;
            if(isdigit(atoi(optarg))==0){
                fprintf(stderr,"Argument after -s needs to be an int\n");
                return 0;
            }**
            else{
                size = atoi(optarg);
            }
             break;

        default{
        return 0;
        }  

2 个答案:

答案 0 :(得分:3)

isdigit接受一个字符并告诉你它是否是一个数字。 atoi接受一个字符串(char *)并返回字符串表示的数字。所以当你打电话给isdigit(atoi(时......你正在拿一个数字并把它当成一个角色。由于数字的字符代码是48..57,因此除了其中一个数字之外的任何数字都将返回false。

您可能想要isdigit(*optarg) - 这将告诉您参数(字符串)的第一个字符是否为数字字符。当然,这只会查看第一个字符,因此您可能需要isdigit(optarg[0]) && optarg[1] == 0

如果您想接受号码而不是数字(只有一个号码),strtol的效果要比atoi好得多。它允许您检查故障。类似的东西:

char *end;
errno = 0;
size = strtol(optarg, &end, 10);
while (isspace(*end)) ++end;
if (errno || *end) {
    // an error occurred on conversion, or there is extra cruft
    // after a number in the argument.
    fprintf(stderr,"Argument after -s needs to be an int\n");
    return 0; }

答案 1 :(得分:2)

克里斯多德有一个很好的答案。另一种可能更简单的方法如下(假设您只想知道optarg是否为单个数字:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Assuming ASCII. "string" must be one character long and it
// must be a digit
int isSingleDigit( char *str )
{
    return( (strlen(str) == 1) && ( *str >= '0'  && *str <= '9' ) );
}

int main (void)
{

    char *str = "a";
    char *str1 = "9";
    char *str2 = "10";
    char *str3 = "1a";


    printf( "%s %d\n", str, isSingleDigit(str));
    printf( "%s %d\n", str1, isSingleDigit(str1));
    printf( "%s %d\n", str2, isSingleDigit(str2));
    printf( "%s %d\n", str3, isSingleDigit(str3));


    return 0;
}

输出:

a 0
9 1
10 0
1a 0