我看到了这个answer (你可以在那里使用 Ideone 中的小例子,它是等价的),所以我写了下面的函数来完成这项工作,但它会在读取小数位前的点时停止,并将 pi 视为 3 和 14。如何更改提取实数的代码?我不关心速度或内存使用情况,我只想完成工作。
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.
最佳答案
strtol
将文本转换为 long
,而不是 float
。来自 strtol
:
Interprets an integer value in a byte string pointed to by
str
.
使用 strtof
或 strtod
转换为 float
或 double
。原型(prototype)使用第二个参数,通常称为 endptr
,它是一个 char *
,它将被更新以指向第一个未转换的字符,但由于您不这里需要它你可以将它设置为NULL
。
对该例程进行了更多优化:
- 您可以安全地修改参数
*str
- 不需要中间值,可以返回
strtof
的结果 - 在显式
return
之后不需要else
- 如果值
-1.0f
是一个可能的有效返回值,您应该使用NAN
。
float extract_number (char* str)
{
while (*str)
{
if (isdigit(*str))
{
return strtof(str, NULL);
}
str++;
}
return NAN;
}
要返回 NAN
,您需要包含 math.h
,但这是一个相当新的添加(显然,之前遗漏了!)所以它可能不是在您的系统中可用。如果不是,请使用这个完全邪恶的 hack(J.Kraftcheck's answer here 的荣誉):
return strtof("NaN", NULL);
关于c - 如何从字符串中提取实数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31372363/