strstr返回如何不是常数

时间:2015-04-23 14:49:19

标签: c++ c string

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

我想知道如何实现违反const-correctness的标准函数。

7 个答案:

答案 0 :(得分:28)

所有const char *告诉您strstr不会修改您传入其中的字符串。

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

在C ++中,这已经通过重载方法和两个版本而改变,const输入版本具有const输出。

在C中,它并没有内置的安全级别,并假设您自己是否应该修改返回的字符串。

答案 1 :(得分:13)

根据ISO C ++ 21.8(7)strstr返回const char*char*,具体取决于它是const char*还是char*。< / p>

const char* strstr(const char* s1, const char* s2);

char* strstr( char* s1, const char* s2);

答案 2 :(得分:13)

C允许使用const或非const指针指向内存,无论该对象是否使用const限定符定义。

  

6.5表达式

     
      
  1. 对象的存储值只能由具有其中一个的左值表达式访问   以下类型:
  2.         

    - 与对象的有效类型兼容的类型的限定版本

C中的strstr原型是:

char *strstr(const char *s1, const char *s2);

返回的指针(如果有效)指向字符串s1。这可以通过演员来实现:

const char safe = 's' ;
char* careful = ( char* )&safe ;

问题在于修改内存。

  

6.7.3类型限定符

     
      
  1. 如果尝试通过use修改使用const限定类型定义的对象   对于非const限定类型的左值,行为未定义。
  2.   

由于您创建了字符串,您应该知道是否可以修改它,因此您可以使用指向const的指针接受返回值,以避免任何问题:

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

答案 3 :(得分:5)

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

请注意,返回指向char*字符串的const char[]只是危险的,但尚未违反任何规则。但是,任何写入该内存的尝试仍然是未定义的行为。

答案 4 :(得分:4)

strstr函数的历史可以追溯到const指针之前的时代。如果代码写入由传递给strstr的第一个指针所标识的内存是合法的,那么代码写入返回指针所标识的内存是合法的,并且在返回值的情况下只能以指向只读内存的指针(例如字符串文字)合法使用,可以合法地将这样的指针传递给strstr

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

答案 5 :(得分:2)

C ++ provides two versions一个接受const参数,一个接受非const。

const char* strstr( const char* str, const char* target );      
char* strstr(       char* str, const char* target );

因为在C中我们不能超载,所以我们有两个不愉快的选择:

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

答案 6 :(得分:1)

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