我看到了这个answer(你可以在Ideone中使用次要的例子,它是等价的),所以我写了下面的函数来完成这项工作,但是在读取之前它会停止十进制数字,将像3和14一样对待pi。如何更改代码以提取实数?我不关心速度或内存使用情况,我只是想做这个工作。
float extract_number(char* str) {
char* p = str;
while (*p) {
if (isdigit(*p)) {
long val = strtol(p, &p, 10);
printf("%ld\n", val);
return val;
} else {
p++;
}
}
return -1.0;
}
以下是我正在使用的str
:
Initializing data structure(s) took 149.898690000 seconds wall clock time.
答案 0 :(得分:2)
就个人而言,我喜欢sscanf进行字符串解析:
double extract_number(char* str) {
double x;
int result = sscanf (str, "%lf", &x);
if (result != 1)
return -1.0;
return x;
}
注:
如果要分离浮点值的整数部分和小数部分,请查看modf()。
答案 1 :(得分:2)
strtol
将文字转换为long
,而不是float
。来自strtol
:
解释
str
指向的字节字符串中的整数值。
使用strtof
或strtod
转换为float
或double
。原型使用第二个参数,通常称为endptr
,它是一个char *
,它将被更新为指向第一个未转换的字符,但由于你不需要它,你可以设置它到NULL
。
对该例程进行了几次优化:
*str
strtof
else
return
-1.0f
是可能的有效返回值,则应使用NAN
。float extract_number (char* str)
{
while (*str)
{
if (isdigit(*str))
{
return strtof(str, NULL);
}
str++;
}
return NAN;
}
要返回NAN
,您需要包含math.h
,但这是一个相当新的补充(显然,之前有遗漏!)所以它可能在您的系统中不可用。如果不是,请使用这个完全邪恶的黑客(荣誉J.Kraftcheck's answer here):
return strtof("NaN", NULL);