2017-09-19 31 views
0

我正在寫一個函數來檢查字符串是否是迴文。 例如aba,abba,a ba,a ba,一罐金槍魚的堅果。 Abba不是迴文,「」(奇數空格)和「」(雙空格)不是。ispalindrome C,檢查空間問題

int is_palindrome(const char string[]) { 

    // This implementation is only partly correct 
    int string_length = length(string); 
    int i = 0, j = string_length - 1; 
    for (i = 0; i < j + 1; i++, j--) { 
    while (string[i] == ' ') { 
     i = i + 1; 
    } 
    while (string[j] == ' ') { 
     j = j - 1; 
    } 
    if (string[i] == ' ' && string[j] == ' ') { 
     break; 
    } 

    if (string[i] != string[j]) { 
     return 0; 
    } 
    } 
    return 1; 
} 

但是,我真正的問題是,這個功能不能檢查或者oddspace和的DoubleSpace,我不能看到我錯了。

+1

一個調試器會讓它更容易發現問題。特別是對於這個問題,單步法可以很好地發現事物脫離軌道的位置。 – WhozCraig

+0

如果它部分正確,那就錯了 –

+0

我也沒有看到實際比較'string [i]'和'string [j]'的*字符的位置。你經歷了很多工作才能找到'i'和'j'。將這些努力與你知道的唯一條件進行比較並不是真的,因爲它們是打破上述循環的條件,看起來沒有什麼效果。 – WhozCraig

回答

0

有幾個問題。首先,測試string[i] == ' 'string[j] == ' '是否毫無意義。前面的幾行保證它們不會是空格;如果他們是,你會跳過他們。

你還有一個問題,你減少j的方式 - 你永遠不會檢查,以確保你沒有跑掉字符串的開始。我認爲處理這個問題的最簡單方法是不讓我增加過去的j,並且不允許j減少過去的i。

我不明白你對這個奇怪的空間和雙倍空間不是palindromes意味着什麼。你忽略了迴文中的空格(否則「一罐金槍魚的堅果不會是一個)」。它是否至少必須有一個非空格字符才能被判斷爲迴文?我只是添加一個布爾值並將其設置在for()循環的底部,以顯示您至少有一個非空格字符,並將該最終返回值作爲該布爾值的基礎。

+0

謝謝,你的第一點對我很有意義。我在循環之後添加了一個if函數,它檢查是否i-1 == j,如果是,那麼它不是迴文,因爲所有字符都是空格。 –