[英]How can I make function that take a string and return a char array
[英]How can I make my strchr function take both 'const char' and 'char' arrays as first parameter?
我期望我的功能與cstring
/ string.h
庫中使用的功能“ strchr”相同。 我了解我無法將“ 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<<
不起作用。 我正在尋找一種方法來更改我的功能(我猜第一個參數應該以某種方式進行typecast)。
如何使我的strchr函數同時使用'const char'和'char'數組作為第一個參數?
您可以將參數更改為const char*
。 這將允許將兩個指針傳遞給char
以及const char
。
但是,您將返回一個非const指針指向該數組,如果該指針指向const數組則不應這樣做。 因此,當傳遞const char*
,您的函數還應該返回const char*
但是,預定義的“ strchr”函數如何能夠同時傳遞“ const char”和“ char”數據類型數組並正常工作?
有兩個預定義的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指針進行修改。
簡短答案:將place_to_find的類型設為const char *
出現錯誤的原因是,您無法將指向const char的指針隱式轉換為指向非const char的指針。 如果可以,則可以更改指針所指向的char,這將使實現const char類型的目的擺在首位。
您可以將指向非const char的指針隱式轉換為指向const char的指針,因為它不會消除任何限制。
LE:同樣,返回值應該是const char *,因為同樣,如果您不這樣做,它將刪除不允許的const限制。 唯一的問題是您將無法通過返回的指針修改數組。 如果還需要這樣做,則必須在char和const char上重載該方法。
使用C ++標准庫中的方法進行兩次重載:
char* my_strchr( char *place_to_find, char what_to_find)
const char* my_strchr(const char *place_to_find, char what_to_find)
即使在您的情況下,僅第二個重載就足夠了( 演示 ),當您需要找到一個字符然后替換它時,您將無法支持重要的用例:
// This would not work with only one overload:
char *ptr = my_strchr(vocals2,'e');
if (ptr) {
*ptr = 'E';
}
這就是為什么非const
重載是必要的原因。
注意:我假設您是在進行學習,因為C風格的字符串函數對於新開發不再是必需的,已被std::string
功能取代。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.