2012-10-24 41 views
2
bool repeat_char(char *s, int n); 
//R: s is a C-string of at least n non-NUL characters and n > 0 
//E: returns true if the first n characters are fully repeated throughout the string s, false 
// otherwise. 

我在使用遍歷指針實現此函數時遇到問題。我在想,我可以從s中提取前n個字符,然後用它與s進行比較,但我不知道該怎麼做。如果我一次遍歷一個字符,我怎麼能檢查它是否與一段文本匹配,比如s的前n個字符?使用指針遍歷檢查字符串是否重複

謝謝!

回答

1

你真的只能一次比較一個字符,所以你從ss+n開始,並比較一個字符。如果它們匹配,則將s+1s+n+1的字符進行比較。如果它們匹配,請轉至s+2,依此類推直至n。如果它們匹配到那一點,則重複從s + n * 2開始,然後s + n * 3等等,直到到達字符串的末尾。

如果發現不匹配,或者在匹配子字符串的最後一個字符的任何地方到達字符串的末尾,則返回false。否則,你返回true。

+0

怎麼樣的情況下,我們有 「hellohellohellohello」,5?因此,你好不止一次? –

+1

@BobJohn:至少根據你所說的,這是無關緊要的 - 如果至少有一場比賽,你只需要返回true,對吧?如果是這樣,那麼在字符串後面可能有更多匹配的事實是無關緊要的。 –

+0

我想你誤會了。子字符串必須在整個字符串中完全重複。所以,在我給出的例子中,如果最後一個「o」被改爲「t」,那麼函數應該返回false。 –

0

替代方法(通過指針不太遍歷):

bool repeatOfFirstChars(int n, const char *s) 
{ 
    len = strlen(s); 

    if (len % n != 0) return false; 

    for (int step = 1; step < len/n; step++) { 
    if (0 != strncmp(s, s+n*step, n)) return false; 
    } 

    return true; 
}