- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
标准 C 库函数 strtof
和 strtod
具有以下签名:
float strtof(const char *str, char **endptr);
double strtod(const char *str, char **endptr);
它们分别将输入字符串 str
分解为三个部分:
如果 endptr
不是 NULL
,则 *endptr
被设置为指向紧跟在最后一个字符之后的字符的指针,该字符是转换(换句话说,尾随序列的开始)。
我想知道:为什么 endptr
是一个指向 non-const
char
指针的指针? *endptr
不是指向 const
char
字符串(输入字符串 str
)的指针吗?
最佳答案
原因很简单,就是可用性。 char *
可以自动转为const char *
,但是char **
不能自动转为const char **
,并且调用函数使用的指针(其地址被传递)的实际类型更有可能是 char *
而不是 const char *
。这种自动转换不可能的原因是,有一种非显而易见的方法可用于通过几个步骤删除 const
限定,其中每个步骤本身看起来都是完全有效和正确的。 Steve Jessop 在评论中提供了一个示例:
if you could automatically convert
char**
toconst char**
, then you could dochar *p;
char **pp = &p;
const char** cp = pp;
*cp = (const char*) "hello";
*p = 'j';.For const-safety, one of those lines must be illegal, and since the others are all perfectly normal operations, it has to be
cp = pp;
更好的方法是将这些函数定义为使用
idea;它不仅阻止了任何类型检查,而且 C 实际上还禁止 void *
代替
char **
。
char **
和
const char **
都可以自动转换为
void *
。
char *
和 const char *
类型的对象作为别名。)或者,这些函数可以采用ptrdiff_t *
或 size_t *
参数,用于存储结尾的偏移,而不是指向它的指针。无论如何,这通常更有用。
如果您喜欢后一种方法,请随意围绕标准库函数编写这样的包装器并调用您的包装器,以保持代码的其余部分 const
-clean 和 cast-free .
关于c - 为什么 strtof 和 strtod 的 endptr 参数是指向非 const char 指针的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3874196/
这个问题已经有答案了: Is floating point math broken? (33 个回答) 已关闭 4 年前。 编辑- 所以我明白这个问题没有解决办法。有谁知道 C 中的函数可以从数组(s
这个问题已经有答案了: Why are floating point numbers inaccurate? (5 个回答) Why is scanf taking the wrong input f
我有一个关于分配和释放内存的问题。 我想循环读取一个char buffer,并将float值保存到一个vector中。我通过读取 fstream 获取缓冲区。 但我的方法在最后删除缓冲区时总是崩溃。
在 Visual Studio 2013 中,我有以下测试代码: #include #include #include #include int main ( int argc, const
这个问题在这里已经有了答案: How do I print a double value with full precision using cout? (17 个答案) 关闭 6 年前。 这里:
我根本找不到这个函数在哪个库/头文件中,我看了很多人使用这个函数的例子,但是没有结果......这些是我包含的所有内容: #include "Console.h" #include "Direct3D
首先,使用标志 -Wall、-ansi、-pedantic 进行编译。没有警告或错误。并且没有任何调试有帮助。 基本上我的代码工作正常但是当我使用 strtof() 将标记从字符串转换为 float
假设你有一个像“0.1”这样的字符串,它只能近似表示为二进制 float ,你想将它转换为单精度 float 。这可以作为 strtof(s, 0); 或 (float)strtod(s, 0); 直
这可能是什么问题? It doesn't matter what number I choose for str, it is always 26815615859885194199148049996
#include #include #include int main(){ char aaa[35] = "1.25"; char* bbb = &(aaa[0]); char**
我正在尝试将 CSV 文件解析为 C 中的二维数组。我想制作一个具有结构的矩阵: typedef struct { int row; int col; float **arr;
我的这部分 C 代码有些问题。除了返回 0.000 而不是 float 的函数“strtof”之外,一切都应该运行良好。 代码应该做什么:读一行,例如“一个12”如果第一个字符是“a”,则使用 str
可能这是一个非常愚蠢的问题,但我不明白......为了从 ASCII 表示转换为相关数字,我在 Visual Studio 2012 中使用 strtof()。根据 https://msdn.micr
与 包含以下代码给出了 123.34 的输出. #include int main() { char *str="123.34"; float f= strtof(str,NULL)
我的 C 生锈了。我正在尝试将字符串转换为 float (或 double )。我试过 atof() 和 strtof(),并尝试按照说明进行操作 here和 here .运气不好。 这是我的代码:
是否有任何计划添加在当前语言环境下不变的 C 标准库字符串处理函数版本? 目前有很多脆弱的解决方法,例如,来自 jansson/strconv.c: static void to_locale(str
标准 C 库函数 strtof 和 strtod 具有以下签名: float strtof(const char *str, char **endptr); double strtod(const c
标准 C 库函数 strtof 和 strtod 具有以下签名: float strtof(const char *str, char **endptr); double strtod(const c
我在启动时立即收到以下错误,但仅适用于运行 API (ProfilerService.java:44) at [[packagename]].App.(App.kt
我是一名优秀的程序员,十分优秀!