我正在创建一个程序来获取数据列表并将其与文件中的“,”分开。但是,有些项目有多个逗号。
是否有任何高效的方法来检查数组的第一个字符?例如:
char *array = {'1','A','C','D','5'};
现在,如果somefunction(array)
以数字开头,即使是char格式,我也只想array
。所以在这个例子中,让somemethod
成为确定第一个元素是否为整数的方法:
char *array = {'1','A','C','D','5'};
if( somemethod ) someaction(array);
我怎么能有效地做到这一点?
答案 0 :(得分:2)
数组的第一个元素是array[0]
所以
if (isdigit(array[0])) someaction(array);
是您正在寻找的。 p>
答案 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
参考页面已经包含了一个基本上可以满足你需要的工作示例。