c++ - 如何让我的 strchr 函数将 'const char' 和 'char' 数组作为第一个参数?

标签 c++ string function parameters strchr

我期望我的函数与我在 cstring 中使用的函数“strchr”一样工作/string.h图书馆。 我知道我不能将“const char* ”变量/数组转换为“char* ”。然而,预定义的“strchr”函数如何能够同时传递“const char”和“char”数据类型数组并正常工作?我怎样才能改变我的使其也能正常工作?

char* my_strchr(char *place_to_find, char what_to_find)
{
for(int i=0;place_to_find[i];i++)
    if(what_to_find==place_to_find[i]) return place_to_find+i;
return NULL;
}
...
int main()
{
const char vocals1[]="AEIOUaeiou";
char vocals2[]="AEIOUaeiou";
cout<<strchr(vocals1,'e');
cout<<strchr(vocals2,'e');
cout<<my_strchr(vocals1,'e');
cout<<my_strchr(vocals2,'e');
return 0;
}

您可能已经知道,我的第三个 cout<<不起作用。 我正在寻找一种方法来改变我的功能(我猜第一个参数应该以某种方式进行类型转换)。

最佳答案

How can I make my strchr function take both 'const char' and 'char' arrays as first parameter?

您可以将参数更改为 const char*。这将允许将指针传递给 char 以及 const char

但是,您返回一个指向该数组的非常量指针,如果该指针指向一个常量数组,您不应该这样做。因此,当传递 const char* 时,您的函数还应该返回 const char*

Yet, how is the predefined "strchr" function able to be passed both "const char" and "char" data type arrays and work just fine ?

有两个预定义的 std::strchr 函数。一个接受并返回 char*,另一个接受并返回 const char*:

const char* strchr(const char* str, int ch);
      char* strchr(      char* str, int ch);

如果您希望在 char* 参数的情况下返回 char* ,您需要针对每种情况使用不同的函数,就像标准库一样。您可以像标准库那样使用重载,也可以使用函数模板生成两种变体而不重复:

template<class Char>
Char* my_strchr(Char *place_to_find, char what_to_find)

请注意,该函数的 C 版本声明为 char *strchr(const char *str, int ch)。这使得单个函数在两种情况下都可用,但不安全,因为类型系统将无法阻止函数的用户通过返回的非 const 指针进行修改,即使将 const 数组作为参数传递也是如此。

关于c++ - 如何让我的 strchr 函数将 'const char' 和 'char' 数组作为第一个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55973692/

相关文章:

javascript - 为什么调用此函数时输出未定义?

android - 为 android 构建 openframeworks 时出错 : “invalid use of incomplete type ‘class Poco::Path’ ”

c++ - MS 构建错误 MSB8007 : The Platform for project 'MyProject.vcxproj' is invalid. 使用 MSBuild 针对自定义 SDK 构建 Visual Studio 项目

javascript - 将字符串转换为具有多个条目的单个数组

c - 我无法输入带空格的字符串

javascript - 如何使用返回类型调用多个函数 onclick?

c++ - 函数指针只在main内部起作用?

c++ - 像 32i64 这样的操作数是什么意思?

c++ - 在 boost::asio 程序中刷新缓冲区

c - 传递字符串数组 C