如何测试存储为字符串的数字是否为指数(在Linux中)?
我可以使用扫描数字和查找是否存在'e'等方法,但我需要一种更聪明的方法来查找。
是否存在任何API可以快速查找并判断它是否为指数数字?
我可以使用蛮力方法,例如搜索整个字符串,然后获得一个'e',然后是+/-,然后是一个数字。但我需要一种更快捷,更智能的方式,这样可以减少机器周期。
P.S:指数数字是这样的数字:43e4,23e-2(任何数字之间都有e
)
答案 0 :(得分:4)
指数不存在。存储在float
或double
中的数字对于输入0.01
或1E-2
具有相同的位模式。数字也不存储在字符串中。字符串存储在字符串中。因此,如果将数字转换为字符串,则可以隐式或显式选择某个转换。在转换之后,您只使用数字的表示,而不是数字本身。
如果您的转换选择将数字0.1
转换为字符串"1E-1"
或"0.1"
或"10^-1"
,那么它将使用您的定义 - 只有一个指数数字这三个案子?这只有在非常有趣的场景才有意义,所以请退后一步思考,真正的问题是什么。
答案 1 :(得分:3)
regex_t re;
regcomp(&re, "^([0-9]+[.]?[0-9]*|[0-9]*[.][0-9]+)[eE][+-]?[0-9]+$", REG_EXTENDED);
if (!regexec(&re, str, 0, 0, 0)) /* It's an "exponential number" */
答案 2 :(得分:1)
我假设给定一个已知可解析为字符串的字符串,您想知道它是否采用科学记数法,即其中有e
。
使用标准库的strchr
功能是否足够聪明?
char *num_str = "43e4";
if (strchr(num_str, 'e'))
{
/* It's in scientific notation! */
...
}
更多strchr
文档:
http://www.gnu.org/software/libc/manual/html_node/Search-Functions.html#index-strchr-549
答案 3 :(得分:1)
看看lex(或flex)。
我用来识别科学记数字的规则如下:
{DIGIT}*\.{DIGIT}+[eE][+-]?{DIGIT}+ |
{DIGIT}+\.{DIGIT}*[eE][+-]?{DIGIT}+ |
{DIGIT}+[eE][+-]?{DIGIT}+
DIGIT定义为:
DIGIT [0-9]
答案 4 :(得分:1)
我没有看到做strchr(数字,'e')或strchr(数字,'E')以检查你是否有科学记数法会出错。为了防止kingsmasher1解释的问题,你应该检查sscanf是否接受该字符串是有效的。
另一种方法(未测试)可能是使用“%f”和“%g”(“%e”)比较sscanf的结果。 请注意,e可能显示为小写或大写字母。
答案 5 :(得分:1)
第1步:要检查字符串是否可以解释为double,只需使用strtod
然后检查endptr
:
double strtod(const char *nptr, char **endptr);
第2步:我怀疑是否存在预先存在的API,用于检查表示为字符串的浮点数是否包含显式指数。但是,这是一项微不足道的任务,我认为你应该简单地编写自己的函数。
int has_exp(const char* s) {
while (*s != 0) {
if (*s == 'e' || *s == 'E') return 1;
s++;
}
return 0;
}