gpt4 book ai didi

c - 如何在不放弃 const 的情况下实现 strstr()?

转载 作者:太空狗 更新时间:2023-10-29 16:48:56 25 4
gpt4 key购买 nike

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

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

是否可以实现此功能而不在某处丢弃const

供引用,这里是Apple's implementation ,这里是 GNU's implementation .两者都在最后抛弃了 const

最佳答案

如果不以某种方式违反const 正确性,就无法实现strstr()。强制转换是最直接的方法。您可能可以以某种方式隐藏违规(例如,您可以使用 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 参数的情况下返回指向 const char 的指针,另一个在给定可修改的参数的情况下返回指向可修改的 char 的指针争论。 (C++继承了C标准库,通过重载来做到这一点。)

strstr() 是存在此问题的几个标准字符串函数之一。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com