簡體   English   中英

檢查數組的第一個元素是否為C中的數字

[英]Check if the first element of an array is a digit in C

我正在編寫一個程序以獲取數據列表,並用文件中的“,”將其分開。 但是,某些項目有多個逗號。

有沒有任何有效的方法來檢查數組的第一個字符? 例如:

char *array = {'1','A','C','D','5'};

現在,我只想在array以數字開頭的情況下執行somefunction(array) ,即使它是char格式也是如此。 因此,在此示例中,讓somemethod方法確定第一個元素是否為整數:

char *array = {'1','A','C','D','5'};
if( somemethod ) someaction(array); 

我怎樣才能有效地做到這一點?

數組的第一個元素是array[0]因此

if (isdigit(array[0])) someaction(array);

是您要尋找的。

<ctype.h>的標准函數isdigit也可能有效:

#include <ctype.h>

if (isdigit((unsigned char)array[0])) someaction(array);

您還可以通過兩個比較來定義自己的:

#if (!defined __STDC_VERSION__) || (__STDC_VERSION__ < 199901L)
# undef inline
# undef bool
# define inline 
# define bool int
#endif

inline bool somemethod(const unsigned char c) { return c >= '0' && c <= '9'; }

但是,在此處考慮性能似乎是過早的優化

不確定效率驅動將帶來什么,但是有一種非常簡單的方法可以做到這一點:

_Bool doesBeginWithNumber( char *input ) {
    return input[0] >= '0' && input[0] <= '9';
}

它檢查第一個字符的ASCII值。 如果介於0和9之間,則為數字。

另一種方法是使用查找表,如果您進行更復雜的檢查,它可能會更有效(但是對於數字,它可能會更慢-找出基准!):

_Bool doesBeginWithNumber( char *input ) {
    const static _Bool cases[256] = {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    }
    return cases[(unsigned char) input];
}

正如其他人所指出的,另一個選擇是好的老式標准化isdigit

_Bool doesBeginWithNumber( char *input ) {
    return isdigit( input[0] );
}

isdigit參考頁面已經包含一個工作示例,基本上isdigit您的需求。

暫無
暫無

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

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