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

char *strstr(const char *haystack, const char *needle);

可以在不丢弃const的情况下实现此功能吗?

供引用,这是Apple's implementation,这是GNU's implementation。两者都在结尾处丢弃了const

最佳答案

如果不以某种方式违反strstr()的正确性,就无法实现const。强制转换是最简单的方法。您可能会以某种方式隐藏冲突(例如,可以使用memcpy()复制指针值),但是这样做没有任何意义。

问题是strstr()接受指向一个字符串的const char*,并返回一个指向同一字符串的非const char*

例如,该程序:

#include <stdio.h>
#include <string.h>
int main(void) {
    const char s[] = "hello";
    char *result = strstr(s, "hello");
    *result = 'H';
    puts(result);
}

修改(或至少尝试修改)符合const的对象,而无需使用指针强制转换或任何其他明显不安全的构造。

早在1989年,ANSI C委员会就可以通过定义两个不同的函数来避免此问题,例如:
const char *strcstr(const char *haystack, const char *needle);
      char *strstr (      char *haystack, const char *needle);

一个返回给定const char参数的const的指针,另一个返回给定可修改参数的可修改char的指针。 (继承自C标准库的C++通过重载来实现。)
strstr()是具有此问题的几种标准字符串函数之一。

关于c - 如何在不抛弃const的情况下实现strstr()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36610899/

10-12 17:51