2012-08-28 26 views
5

考慮這個功能我寫了真正的快速查找特定字符的最後一次出現在一個字符串並返回它的字符數組中的位置在物理上是字符串:找到最後一個字符出現的最有效的方法

size_t strlstchar(const char *str, const char ch) 
{ 
    char *chptr = strrchr(str, ch); 
    return chptr - str; 
} 

我只是在這裏真正快速地輸入了它(尚未編譯或尚未完成),只是因爲我對幾件事情有疑問。

對我來說,這似乎是最簡單的解決方案,以找到哪個數組元素保存特定字符的最後一個實例,但我不知道它是如何工作的。我只是按照strrchr的文檔來做這件事,所以它在技術上做得更好。我無法想象這是實現這一目標的最好方式(就性能而言),並希望有人能夠就如何做到這一點的最佳方式提供一些意見。

是否strrchr是一種有效的方法?或者strrchr最適合其他用途?

+0

strrchr可以返回NULL,從而使您的函數的結果很難預測何時無法找到字符。通常「-str」可以看作是一個隨機數,然後轉換爲size_t,你怎麼知道你沒有找到char? – xryl669

回答

4

您使用的方法非常好 - 不幸的是,陣列操作很昂貴。在大多數實現中,Strrchr只是從字符串的末尾開始逐個查找字符串,直到找到匹配的字符。這是O(n)時間。然後你執行一個減法,它是O(1)。這並不壞。

+0

有趣的,感謝您的快速回答,我總是覺得猶豫使用字符串函數,我想這是一個習慣或某事不確定爲什麼它鑽入我的大腦,「如果您使用string.h中定義的函數'做錯了「 –

+1

@KeithMiller這是錯誤的。這些功能就是爲了這個目的。如果有一種解決所有算法問題的不可思議的恆定時間方式,libc實現者將使用它。並且永遠記得Linus Torvalds寫到的一句話:「任何理智的人都知道K&R是對的」:) – 2012-08-28 20:38:05

+1

由於它們的特殊性質(由0x00結束),字符串真的很慢:strrchr()從開始到結束字符串(通過調用strlen()知道字符串的結尾,遍歷整個字符串,然後從末尾開始直到找到字符,或者通過簡單的傳遞直到字符串結束)。所以無論你在哪裏找到角色,都會掃描整個字符串! – Parallelis

3

從文檔:

返回指向字符在C字符串str中最後一次出現。

所以它確實是你想要的。其存在的目的是這樣的。

是否strrchr是一種有效的方法?

這幾乎可以肯定地寫成至少與你自己做的一樣好或者更好。

或者是strrchr最好還有其他用途?

不是。它完全是爲此目的而寫的。

0

如果您可以提供字符串的長度然後向後循環,它會更快。當你立刻發現第一次出現的人物迴歸時。

如果你不知道長度只是使用strrchr。

+0

這就是我的想法,但是在什麼情況下我不知道字符串的長度除非它包含NULL字符或什麼的,那麼它甚至會被視爲一個字符串?或只是一大塊數據?如果這會更有效率,爲什麼在標準庫中不這樣呢?這似乎很簡單?這就是爲什麼我很困惑,因爲有時候事情對我沒有意義:( –

+0

通常在C中你不知道字符串的長度,所以在strrchr中不包含長度更有意義所以你不用每次使用strrchr時都不需要strlen來獲取長度,但是也有很多函數會在scanf成功時返回長度,如果您的代碼真的需要更高效,可以向後循環。 –

相關問題