gpt4 book ai didi

c - 为什么 strtof 和 strtod 的 endptr 参数是指向非 const char 指针的指针?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:13 24 4
gpt4 key购买 nike

标准 C 库函数 strtofstrtod 具有以下签名:

float strtof(const char *str, char **endptr);
double strtod(const char *str, char **endptr);

它们分别将输入字符串 str 分解为三个部分:

  1. 一个初始的、可能为空的空白序列
  2. 表示浮点值的字符“主题序列”
  3. 无法识别(并且不影响转换)的字符“尾随序列”。

如果 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** to const char**, then you could do

char *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;

更好的方法是将这些函数定义为使用 void * 代替 char **char **const char ** 都可以自动转换为 void * idea;它不仅阻止了任何类型检查,而且 C 实际上还禁止 char *const char * 类型的对象作为别名。)或者,这些函数可以采用ptrdiff_t *size_t * 参数,用于存储结尾的偏移,而不是指向它的指针。无论如何,这通常更有用。

如果您喜欢后一种方法,请随意围绕标准库函数编写这样的包装器并调用您的包装器,以保持代码的其余部分 const-clean 和 cast-free .

关于c - 为什么 strtof 和 strtod 的 endptr 参数是指向非 const char 指针的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28508898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com