如何实现strstr()而不抛弃const?

Ana*_*Ana 10 c casting const

strstr 是符合C99的函数,其类型签名如下:

char *strstr(const char *haystack, const char *needle);
Run Code Online (Sandbox Code Playgroud)

是否可以在不丢弃某个地方的情况下实现此功能const

作为参考,这是Apple的实现,这里是GNU的实现.两人都扔掉const了最后.

Kei*_*son 9

如果不以某种方式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 charconst参数的指针,另一个返回指向给char定可修改参数的可修改指针.(C++,它继承了C标准库,通过重载来实现这一点.)

strstr() 是有这个问题的几个标准字符串函数之一.