检查数组的第一个元素是否是C中的数字

时间:2013-04-14 13:52:16

标签: c arrays string

我正在创建一个程序来获取数据列表并将其与文件中的“,”分开。但是,有些项目有多个逗号。

是否有任何高效的方法来检查数组的第一个字符?例如:

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

现在,如果somefunction(array)以数字开头,即使是char格式,我也只想array。所以在这个例子中,让somemethod成为确定第一个元素是否为整数的方法:

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

我怎么能有效地做到这一点?

4 个答案:

答案 0 :(得分:2)

数组的第一个元素是array[0]所以

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

是您正在寻找的。

答案 1 :(得分:1)

来自isdigit的标准函数<ctype.h>也可能有效:

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

但是,考虑这里的表演看起来像premature optimization

答案 2 :(得分:0)

不确定您使用效率驱动器会得到什么,但有一种非常简单的方法可以做到这一点:

_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] );
}

答案 3 :(得分:0)

isdigit参考页面已经包含了一个基本上可以满足你需要的工作示例。