一些語言,如 Java,要求您創建另一個字串來解決某些型別的問題。但是對于 C 語言,什么時候應該創建另一個字串,什么時候應該簡單地修改一個現有的字串?
以下面的代碼為例:
char *removeTags(char *s, int length)
{
if (!s || length < 1)
{
exit(EXIT_FAILURE);
}
char *tmp = calloc(length, sizeof(char));
int count = 0;
for (int i = 0; i < length; i )
{
if (s[i] == '<')
{
for (int k = i; k < length; k )
{
if (s[k] == '>')
{
i = k;
break;
}
}
}
else if (s[i] != '>' && s[i] != '<')
{
tmp[count] = s[i];
count ;
}
}
return tmp;
}
它應該被稱為如下:
char *foo = (char *)calloc(length, sizeof(char)); foo = removeTags(foo, strlen(foo));
如果我只是修改char *s而不是創建char *tmp 來幫助我會更好嗎?
uj5u.com熱心網友回復:
如果函式處理字串,那么第二個引數是多余的并且容易出錯
char *removeTags(char *s, int length)
如果要創建一個新字串,則必須將函式宣告為
char * removeTags( const char *s );
即函式引數應具有限定符const。
如果要更改字串,則必須將函式宣告為
char * removeTags( char *s );
請注意,您可能不會更改字串文字。
如果你也傳遞給函式字串文字,那么函式必須宣告為
char * removeTags( const char *s );
您可以定義這兩個函式,但在這種情況下,您需要使用不同的函式名稱。
uj5u.com熱心網友回復:
每當您在 C 函式中修改字串時,都有一個很好的理由來制作字串的副本并修改并回傳副本,同時將輸入字串引數設為 a const char *。
您的呼叫者不會通過傳入字串文字來呼叫未定義的行為。這可能會使您的整個程序崩潰,例如SIGSEGV.
像這樣:
char *removeTags(const char *s);
通常,您不需要為字串操作傳遞長度,除非您需要限制您正在操作的字串的范圍。
另一個不太重要的原因:呼叫者可能沒有處理字串,可能需要它未經修改。
如果您隨后通過分析發現額外的復制步驟會導致性能或記憶體問題,那么您可以創建另一個函式,并將其命名為:
void removeTagsInPlace(char *s);
請注意回傳值的差異,這使得字串被就地修改的事實不可能錯過。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/456702.html
上一篇:默認情況下,全域/區域結構指標的取消參考值是否始終設定為0(或等效值)?
下一篇:如何在指標陣列中分配指標值
