Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ strstr返回的方式不是常数_C++_C_String - Fatal编程技术网

C++ strstr返回的方式不是常数

C++ strstr返回的方式不是常数,c++,c,string,C++,C,String,标准函数strstr用于查找字符串中子字符串的位置。函数的两个参数都是const char*类型,但返回类型是char* 我想知道标准函数是如何违反const正确性的。所有const char*告诉您的是strstr不会修改传递给它的字符串 是否修改返回的字符串取决于您,因为它是您的字符串 在C++中,这是通过重载方法而改变的,并且有两个版本, const 输入版本有 const 输出。< /P> 在C中,它没有为你构建的安全级别,假设你应该修改返回的字符串。< /P> < P>根据ISO C+

标准函数
strstr
用于查找字符串中子字符串的位置。函数的两个参数都是
const char*
类型,但返回类型是
char*


我想知道标准函数是如何违反const正确性的。

所有
const char*
告诉您的是
strstr
不会修改传递给它的字符串

是否修改返回的字符串取决于您,因为它是您的字符串

在C++中,这是通过重载方法而改变的,并且有两个版本, const 输入版本有<代码> const 输出。< /P> <>在C中,它没有为你构建的安全级别,假设你应该修改返回的字符串。< /P> < P>根据ISO C++ 21.8(7)<代码> STRSTR> <代码>返回一个<代码> const char *<代码>或<代码> char */COD>根据它是否得到<代码> conchchar */c>或<代码> char */COD> < < /P>
C允许使用常量或非常量指针指向内存,无论对象是否使用常量限定符定义

6.5表达

  • 对象的存储值只能由左值表达式访问,该左值表达式具有 以下类型:
  • -与对象的有效类型兼容的类型的限定版本

    C中strstr的原型为:

    char *strstr(const char *s1, const char *s2);
    
    返回的指针(如果有效)指向字符串s1。这可以通过强制转换来实现:

    const char safe = 's' ;
    char* careful = ( char* )&safe ;
    
    问题在于修改内存

    6.7.3类型限定符

  • 如果试图通过使用修改使用常量限定类型定义的对象 对于具有非常量限定类型的左值,行为未定义
  • 由于您创建了字符串,您应该知道是否可以修改它,因此可以使用指向const的指针接受返回值,以避免出现任何问题:

    const char* find = strstr( ... ) ;
    

    返回值不是作为参数传递给函数的变量。此函数返回指针,指向指针中指定的整个字符序列在haystack中的第一次出现,如果序列在haystack中不存在,则返回空指针。

    通过指定签名并将实现留给编译器生成器来完成

    请注意,返回一个指向
    const char[]
    字符串的
    char*
    是非常危险的,但这并不违反任何规则。然而,任何试图写入该内存的行为仍然是未定义的行为

    C++采用常量参数和非常量参数的参数

    const char* strstr( const char* str, const char* target );      
    char* strstr(       char* str, const char* target );
    
    因为在C语言中,我们不能过载,所以我们有两个不愉快的选择:

    • 要么我们将参数视为非常量,但如果我们的源确实是常量,那么我们需要对非常量执行不愉快的转换
    • 第二个选项是我们有一个选项,我们把参数作为常量,但是我们返回一个非常量。我们可以返回一个const char*,但是我们永远不能修改结果

      • strstr
        函数可以追溯到
        常量
        指针出现之前的一个时代。如果代码写入由传递到
        strstr
        的第一个指针标识的内存是合法的,则代码写入由返回指针标识的内存是合法的,如果返回值仅以与只读内存指针(例如字符串文字)合法的方式使用,人们可以合法地将这样一个指针传递到strstrstr


        如果今天定义了一个类似于strstrstr的功能,那么可以使用两种方法来实现它——其中一种方法可以接受任何指针并返回收件人无法写入的指针,其中一个只接受可写指针,但会返回一个接收者认为合适时可以使用的指针。然而,由于使用
        strstr
        的某些代码需要传递只读指针,并且由于使用
        strstrstr
        的某些代码需要能够写入在给定可写指针时产生的指针,因此有必要让一组指针限定双向工作。结果是一组指针限定条件不是真正“安全的”[因为它可能会返回指向只读内存区域的可写指针],并且在某些情况下会让代码编译,而实际上它“不应该”,但是这将允许在
        const
        指针之前编写的代码继续按预期工作。

        您包括的是cstring,而不是string.h?否则,您使用的是C版本——天知道它们做什么。C++ >代码> STD::STRSTR> <代码>版本只返回<代码> char */COD>如果第一个参数也是非代码> const <代码> char */COD>。看见(抱歉-刚才也注意到了C标记…你实际使用的是哪种语言?@TonyD C版本是
        char*strstrstr(const char*,const char*)注意,在C++中,有一个const char *参数和一个普通char *,返回值如下。当问题不是关于差异、相似性时,请不要使用C和C++标签来解决同一个问题。用两种语言编写代码或使用其他语言中的一种语言的函数。C++是这样的,但是在C99标准<代码> STRSTR> /Cord>返回“代码> char */COD>。我首先看到C++标签,所以我使用C++标准。你对C标准的看法是正确的。C实际上没有函数重载。如果函数首先在C++中引入,它可能会有两种味道,即const和const。但是这个函数最初是在C中引入的。此外,它是在K&R时代引入的,当时没有
        const
        关键字。它仍然与它相关(作为同一数组声明的一部分)
        const char* strstr( const char* str, const char* target );      
        char* strstr(       char* str, const char* target );