strstr返回如何不是常数

Din*_*esh 25 c c++ string

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

我想知道如何实现违反const正确性的标准函数.

Tim*_*m B 28

所有const char *告诉你的是,strstr不会修改你传入它的字符串.

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

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

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

  • C没有的实际上是函数重载.如果函数最初是在C++中引入的,它可能有两种形式,const和非const.但是这个函数最初是在C中引入的.而且,它是在K&R时代引入的,当时没有`const`关键字. (3认同)

Nat*_*ica 13

根据ISO C++ 21.8(7)strstr返回a const char*或a char*取决于它是否得到a const char*或a char*.

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

char* strstr( char* s1, const char* s2);
Run Code Online (Sandbox Code Playgroud)

  • 这对C++来说是正确的,但在C99标准中,`strstr`返回`char*`. (3认同)
  • 我首先看到了C++标签,所以我使用了C++标准.你对C标准是正确的. (2认同)

250*_*501 13

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

6.5表达式

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

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

C中strstr的原型是:

char *strstr(const char *s1, const char *s2);
Run Code Online (Sandbox Code Playgroud)

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

const char safe = 's' ;
char* careful = ( char* )&safe ;
Run Code Online (Sandbox Code Playgroud)

问题在于修改内存.

6.7.3类型限定符

  1. 如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为是未定义的.

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

const char* find = strstr( ... ) ;
Run Code Online (Sandbox Code Playgroud)


MSa*_*ers 5

它是通过指定签名完成的,并将实现留给编译器构建器.

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


sup*_*cat 5

strstr函数可以追溯到出现const指针之类的东西之前的时代。如果代码写入由传递给 的第一个指针标识的内存strstr是合法的,则代码写入由返回的指针标识的内存是合法的,并且在返回值只能以某种方式使用的情况下如果使用指向只读内存的指针(例如字符串文字)是合法的,则可以合法地将这样的指针传递给strstr.

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