当我输入单词“ma'am”时,程序不会将其视为回文

时间:2012-01-25 10:11:48

标签: c++ string palindrome

我这里有一个程序,可以输出句子中的回文数量。不区分大小写并忽略逗号和句点,例如回文恰好是句子中的最后一个单词。

#include <iostream>
#include <string>

using namespace std;

char toUpper(char c) {
    if (c >= 'a' && c <= 'z')
        return c - 'a' + 'A';
    else
        return c;
}

char isLetter(char c) {
    return (toUpper(c) >= 'A' && toUpper(c) <= 'Z');
}

int findNextLetter(string& s, int start) {
    // find first letter at or after 'start'
    for (int i = start; i < s.length(); ++i) {
        if (isLetter(s[i])) return i;
    }
    return s.length();
}

int findNextPunct(string& s, int start) {
    // find first non-letter character at or after 'start'
    for (int i = start; i < s.length(); ++i) {
        if (!isLetter(s[i])) return i;
    }
    return s.length();
}

bool isPalindrome (const string& s, int start, int stop) {
    // look for palindrome in the range (start) to (stop - 1)
    for (int i = 0; i < (stop-start)/2; ++i) {
        if (toUpper(s[start + i]) != toUpper(s[stop - 1 - i])) {
            return false;
        }
    }
    return true;
}

int main() {
    string line;
    int counter=0;
    cout << "Please input a sentence." << endl;
    getline(cin, line);
    int wordStart = findNextLetter(line, 0);
    int wordEnd = findNextPunct(line, wordStart);
    while (wordStart != line.length()) {
        if (isPalindrome(line, wordStart, wordEnd))
            ++counter;
        wordStart = findNextLetter(line, wordEnd); // find start of next word
        wordEnd = findNextPunct(line, wordStart); // find end of next word
    }
    cout << "Number of Palindromes: " << counter << endl;
}

程序运行正常,除非有“ma'am”字样。例如,当“你好,女士!我是Aya。”进入,程序只输出1,这意味着一个回文:Aya。由于撇号,“ma'am”不包括在内。

如果你给我一个具体的代码,我会很高兴,所以我很容易弄明白要改变什么。但是,我仍然感谢你提供各种帮助。 :)

2 个答案:

答案 0 :(得分:3)

wordStart = findNextLetter(line, wordEnd); // find start of next word
wordEnd = findNextPunct(line, wordStart); // find end of next word

将单词定义为一组字母字符。

if (isPalindrome(line, wordStart, wordEnd))

正在检查单词是否是回文。 "ma'am"不是一个词,因为它不仅仅由字母字符组成。 "ma'am"是两个单词"ma""am",用标点字符"'"隔开。

答案 1 :(得分:0)

您的代码已经忽略了逗号和句点;将其扩展为包括撇号,冒号,分号和所有其他形式的标点符号。