簡體   English   中英

如何使我的strchr函數同時使用'const char'和'char'數組作為第一個參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM