[英]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] );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.