Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算一个句子中的回文数_C++_Function_Pointers_Palindrome - Fatal编程技术网

C++ 计算一个句子中的回文数

C++ 计算一个句子中的回文数,c++,function,pointers,palindrome,C++,Function,Pointers,Palindrome,大家好!下面是一个程序,它要求用户输入一个句子,并输出其中的回文数 #include<iostream> #include<string> #include<sstream> using namespace std; bool isPalindrome (const std::string& s) { for (int i = 0; i < (s.length())/2; ++i) { if (s[i] != s[s.

大家好!下面是一个程序,它要求用户输入一个句子,并输出其中的回文数

#include<iostream>
#include<string>
#include<sstream>

using namespace std;

bool isPalindrome (const std::string& s) {
    for (int i = 0; i < (s.length())/2; ++i) {
        if (s[i] != s[s.length()-1 - i])
            return false;
        else
            return true;
    }
}


int main() {
    string sentence;
    int counter=0;
    cout << "Please input a sentence." << endl;
    getline(cin, sentence);
    stringstream processtokens(sentence);
    for(string word; processtokens >> word;) 
        if(isPalindrome(word)) 
            ++counter;
    cout << "Number of Palindromes are : " << counter << endl;
}
它很好用。但举例来说,当我输入一个快速棕色的gag有一个蓝眼睛时,程序显示的回文数只有1,但实际上,这个句子有2个回文:gag和eye。问题是单词eye有一个句号。例如,当用户输入“我爱中午”、“晚上”和“午夜”时,程序怎么能忽略句点和其他标点符号,如逗号呢。Noon是回文,但由于逗号的缘故,程序无法识别它

另一个问题是资本化。我希望这个程序工作,并忽略ASCII等价物当用户输入夫人,我的工作完成。我知道这和托洛尔有关

总之,我希望这个程序有一个函数,a忽略标点符号和b大写

哦,stringstream ProcessTokensContent;的替代方案是什么?相反,我需要这个程序使用substring substr和find


请引导我,伙计们!谢谢你,非常感谢你的帮助。再次感谢你,祝你有愉快的一天

我认为有一个功能可以检查标点符号。您可能想试试ispunt

我认为有一个功能可以检查标点符号。您可能想尝试ispunt

您可以使用并忽略ispunt返回true的任何字符。您还应该在调用中包装字符比较

您可以使用和忽略ispunt返回true的任何字符。你还应该在调用< /p> < p>中包装字符比较,也许这个小练习可以用来介绍一些不错的C++特性,比如迭代器:

inline bool is_letter(char c)
{ return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'); }


bool is_palindrome(const std::string & s)
{
    std::string::const_iterator it = s.begin();
    std::string::const_reverse_iterator rt = s.rbegin();

    while (it != s.end() && rt != s.rend() && std::distance(it, rt.base()) > 0)
    {
        // Skip non-letters
        while (it != s.end() && !is_letter(*it)) { ++it; }
        while (rt != s.rend() && !is_letter(*rt)) { ++rt; }

        if (it == s.end() || rt == s.rend()) { break; }

        // Check palindromy
        if (std::tolower(*it) != std::tolower(*rt)) { return false; }

        // Move on
        ++it;
        ++rt;
    }

    return true;
}
诀窍是从两端攻击字符串。对于这一点,我们有一个普通的迭代器it,来自字符串的开头,还有一个反向迭代器rt,来自字符串的结尾

代码的核心是不敏感地检查回文大小写,通过比较小写字符,即使失败也立即返回false;否则,两个迭代器将前进一个

最后,循环的开头会从字符串中吸收非字母字符,因此这些字符将被完全忽略。我们再次检查狼吞虎咽后是否到达了绳子的末端;必须确保只对有效元素取消引用迭代器


当向前移动的迭代器超过向后移动的迭代器时,循环停止。这是条件distanceit,rt.base>0的内容:反向迭代器的基实际上是反向迭代器元素后面的元素的普通迭代器。因此,只要从它到rt底部的距离严格大于零,它就不会越过rt。当它和RT引用相同的元素时,距离正好是1。

< P>也许这个小练习可以用来介绍一些很好的C++特性,比如迭代器:

inline bool is_letter(char c)
{ return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'); }


bool is_palindrome(const std::string & s)
{
    std::string::const_iterator it = s.begin();
    std::string::const_reverse_iterator rt = s.rbegin();

    while (it != s.end() && rt != s.rend() && std::distance(it, rt.base()) > 0)
    {
        // Skip non-letters
        while (it != s.end() && !is_letter(*it)) { ++it; }
        while (rt != s.rend() && !is_letter(*rt)) { ++rt; }

        if (it == s.end() || rt == s.rend()) { break; }

        // Check palindromy
        if (std::tolower(*it) != std::tolower(*rt)) { return false; }

        // Move on
        ++it;
        ++rt;
    }

    return true;
}
诀窍是从两端攻击字符串。对于这一点,我们有一个普通的迭代器it,来自字符串的开头,还有一个反向迭代器rt,来自字符串的结尾

代码的核心是不敏感地检查回文大小写,通过比较小写字符,即使失败也立即返回false;否则,两个迭代器将前进一个

最后,循环的开头会从字符串中吸收非字母字符,因此这些字符将被完全忽略。我们再次检查狼吞虎咽后是否到达了绳子的末端;必须确保只对有效元素取消引用迭代器


当向前移动的迭代器超过向后移动的迭代器时,循环停止。这是条件distanceit,rt.base>0的内容:反向迭代器的基实际上是反向迭代器元素后面的元素的普通迭代器。因此,只要从它到rt底部的距离严格大于零,它就不会越过rt。当it和rt指同一个元素时,距离正好是1。

您已经描述了几乎所有需要做的事情。将所有内容转换为小写,跳过非字母。你就快到了。你已经描述了你需要做的几乎所有事情。将所有内容转换为小写,跳过非字母。您就快到了。只是想知道,当tolower遇到数字时是否会抛出异常?还是继续前进?@Farhad:当它遇到一个数字时,返回的值是不变的。@Oleksi:谢谢!但我怎么能忽视它们呢?我已经完成了bool函数,但是我不知道接下来要做什么来忽略这些字符。请,谢谢@CandaceParker-您可以使用std::remove_if算法从输入字符串中删除所有标点字符:string.erasestd::remove_ifstring.begin、string.end、::to_low
呃,string.end.只是想知道,tolower遇到数字时是否会抛出异常?还是继续前进?@Farhad:当它遇到一个数字时,返回的值是不变的。@Oleksi:谢谢!但我怎么能忽视它们呢?我已经完成了bool函数,但是我不知道接下来要做什么来忽略这些字符。请,谢谢@CandaceParker-您可以使用std::remove_if算法从输入字符串中删除所有标点字符:string.erasestd::remove_ifstring.begin,string.end,::to_lower,string.end。非常感谢!你帮了大忙!然而,当我运行程序并进入Hello noon时,我爱你!,它显示2作为回文数。我想知道为什么会这样。。。即便如此。我很感激你给我解释清楚了。非常感谢你!哦,我改正了。我本身就是一个回文!再次感谢你!祝您有个美好的一天!非常感谢你!你帮了大忙!然而,当我运行程序并进入Hello noon时,我爱你!,它显示2作为回文数。我想知道为什么会这样。。。即便如此。我很感激你给我解释清楚了。非常感谢你!哦,我改正了。我本身就是一个回文!再次感谢你!祝您有个美好的一天!