我期望我的函数与我在 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/