strstr 是符合C99的函数,其类型签名如下:
char *strstr(const char *haystack, const char *needle);
Run Code Online (Sandbox Code Playgroud)
是否可以在不丢弃某个地方的情况下实现此功能const?
如果不以某种方式strstr()违反const正确性,你就无法实施.演员阵容是最直接的方式.您可以以某种方式隐藏违规(例如,您可以使用memcpy()复制指针值),但这样做没有意义.
问题是strstr()将a const char*指向一个字符串,并返回const char*指向同一字符串的non .
例如,这个程序:
#include <stdio.h>
#include <string.h>
int main(void) {
const char s[] = "hello";
char *result = strstr(s, "hello");
*result = 'H';
puts(result);
}
Run Code Online (Sandbox Code Playgroud)
修改(或至少尝试修改)一个const合格的对象,而不使用指针强制转换或任何其他明显不安全的构造.
早在1989年,ANSI C委员会可以通过定义两个不同的功能来避免这个问题,例如:
const char *strcstr(const char *haystack, const char *needle);
char *strstr ( char *haystack, const char *needle);
Run Code Online (Sandbox Code Playgroud)
一个返回指向给const char定const参数的指针,另一个返回指向给char定可修改参数的可修改指针.(C++,它继承了C标准库,通过重载来实现这一点.)
strstr() 是有这个问题的几个标准字符串函数之一.