-1

我正在制作一个程序来获取数据列表并用文件中的“,”分隔。但是,有些项目有多个逗号。

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

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

现在,我只想以数字开头,somefunction(array)即使array它是 char 格式。所以在这个例子中,让我们somemethod判断第一个元素是否为整数:

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

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

4

4 回答 4

2

数组的第一个元素是array[0]这样的

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

就是你要找的。

于 2013-04-14T13:55:35.753 回答
1

isdigitfrom的标准函数<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'; }

但是,在这里考虑性能看起来像是过早的优化

于 2013-04-14T13:55:45.077 回答
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] );
}
于 2013-04-14T13:55:45.703 回答
0

参考isdigit页面已经包含一个工作示例,它基本上可以满足您的需求。

于 2013-04-14T13:56:00.960 回答