代码之家  ›  专栏  ›  技术社区  ›  Daniel Trebbien

为什么strtof和strtod的endptr参数是指向非常量字符指针的指针?

  •  22
  • Daniel Trebbien  · 技术社区  · 14 年前

    strtof strtod 有下列签名:

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

    str ,分为三部分:

    1. 一个初始的,可能是空的空白序列
    2. 表示浮点值的字符的“主题序列”

    如果 endptr 不是 NULL *endptr 设置为指向紧跟作为转换一部分的最后一个字符之后的字符的指针(换句话说,尾随序列的开始)。

    我在想:为什么 终点 ,然后,指向 非- const char 指针?不是 指向 常量 烧焦 字符串(输入字符串 )?

    2 回复  |  直到 14 年前
        1
  •  11
  •   Community T.Woody    4 年前

    char * 可以自动转换为 const char * char ** 无法自动转换为 const char ** ,并且调用函数使用的指针的实际类型(其地址被传递)更可能是 常量字符* . 这种自动转换不可能的原因是,有一种不明显的方法可以用来删除 const 通过几个步骤进行限定,每个步骤本身看起来都是完全有效和正确的。Steve Jessop在评论中提供了一个例子:

    如果你能自动转换 char** const char** ,那么你可以

    char *p;
    char **pp = &p;
    const char** cp = pp;
    *cp = (const char*) "hello";
    *p = 'j';.
    

    cp = pp;

    void * 代替 字符** 字符** 空的* . (这段受损的文本实际上是一个非常糟糕的想法;它不仅阻止了任何类型的检查,而且C实际上禁止了类型的对象 常量字符* ptrdiff_t * size_t * 在其中存储 抵消 而不是一个指向它的指针。无论如何,这通常更有用。

    常量 -清洁并释放。

        2
  •  5
  •   Aidan Cully    14 年前

    str 参数标记为 const endptr 来电者 他不应该更改引用的数据 在输出时,但通常调用者希望这样做。例如,我可能希望在从字符串中取出浮点数后将其空终止:

    float StrToFAndTerminate(char *Text) {
        float Num;
    
        Num = strtof(Text, &Text);
        *Text = '\0';
        return Num;
    }
    

    在某些情况下,想做完全合理的事情。不起作用,如果 属于类型 const char ** .

    终点 应具有与实际输入常量匹配的常量 str公司 ,但C无法通过其语法来表示这一点。( Anders Hejlsberg talks about this 在描述原因时 常量 被排除在外。)