簡體   English   中英

C使用isdigit檢查optarg是否為數字

[英]C Using isdigit to check if optarg is a digit

如果optarg(Getop庫中標志-s后面的參數)不是數字,我希望打印一條錯誤消息並終止程序,如果它是數字,則需要將大小設置為optarg。 我遇到的問題是,當類似-sr的命令遇到錯誤消息時,-s 2也將出現錯誤消息,這意味着它將2解釋為字符串。

使用-s 2進行調試

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

我在第1行獲得了int值2,在第2行獲得了int值0。

所以我想知道為什么當atoi(optarg)給我一個int時,isdigit(atoi(optarg)))給我0。 有沒有更好的方法來檢查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;
        }  

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; }

克里斯·多德(Chris Dodd)有一個很好的答案。 另一個可能更簡單的方法如下(假設您只是想知道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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM