【发布时间】:2017-12-21 01:42:25
【问题描述】:
在网上找了一圈,没有找到让我满意的解决方案,所以我自己尝试了一下。但是现在在一个讲座中也有人说调用函数和等待返回可能会导致堆栈溢出,那么这是一个坏主意吗?我使用此函数来检查 argv[1] 是否为浮点数。循环会更好吗?还是有更直观的方法?必须正好有一个点,并且后面必须至少有一个数字,对吗?
#include <stdbool.h>
#include <ctype.h>
/**
* checks if string is floating point number
* please call function with pointCounter=0 and digitAfterPoint=false
*/
bool isFloatString(char *s, int pointCounter, bool digitAfterPoint)
{
if (isdigit(*s))
{
if(pointCounter==1)
{
digitAfterPoint=true;
}
return isFloatString(s+1, pointCounter, digitAfterPoint);
}
else if (*s == '.' && pointCounter==0)
{
return isFloatString(s+1, pointCounter+1,digitAfterPoint);
}
else if (*s == '\0' && digitAfterPoint)
{
return true;
}
else
{
return false;
}
}
【问题讨论】:
-
除了不同的环境可能对什么构成浮点数有不同的想法。例如,c++ 编译器对以下内容非常满意:
const float myVal = 3.f;使用sscanf有什么问题吗? -
recursive function 调用更热衷于堆栈溢出。
-
0x2a.bcp4,-2.21l,3.0e4L,3e-4也是 C 中有效浮点文字的示例 -
@enhzflep:
sscanf(实际上,任何解析数字的 C 库函数)是区域设置感知的,并且区域设置是进程范围的而不是线程安全的(所以你不能只切换到 C时刻然后将其切换回来),因此以独立于语言环境的方式解析数据(例如解析 JSON)的唯一方法是自己完成这项工作。这是 IMO C 标准库中最可悲的设计错误之一,因为与许多其他人不同,没有简单的解决方法。 -
您可以使用
strtod()进行转换。它会告诉您停止转换的位置,因此您可以决定数字后的尾随碎片是否可以接受。 OTOH,它会跳过前导空白;如果您不想接受,则必须在调用strtod()之前检测到它——这并不难,但如果它是一个问题,只需将其视为一个问题。
标签: c