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/