有关C ++字符串的问题

时间:2019-03-14 01:56:58

标签: c++ string palindrome

phrase.erase(remove_if (phrase.begin(), phrase.end(), ::isdigit), phrase.end());

在上面的代码中,即使我使用了::,为什么还必须使用using namespace std

#include "Palindrome.h"
#include <iostream>
#include <string.h>
#include <algorithm>

using namespace std;

Palindrome::Palindrome (string Phrase){
    phrase=Phrase;
}

void Palindrome::removeNonLetters()
{
    phrase.erase(remove_if (phrase.begin(), phrase.end(), ::isdigit), phrase.end());

    phrase.erase(remove_if (phrase.begin(), phrase.end(), ::ispunct), phrase.end());

    phrase.erase(remove_if (phrase.begin(), phrase.end(), ::isspace), phrase.end());
}

void Palindrome::lowerCase()
{
    for (int i=0; i<phrase.length(); i++)
    {
        phrase[i] = tolower(phrase[i]); 
    }
}

bool Palindrome::isPalindrome()
{
    int length=phrase.length(); 
    int a=0;    
    for (int i=0;i<length/2;i++)
    { 
        if(phrase[i] != phrase[length-a-1])
        {
            return false;
            break;
        }
        a++;
    }
    return true;
}

上面的代码是检查字符串是否是回文。我不明白为什么我需要使用第一部分

Palindrome::Palindrome (string Phrase){
    phrase=Phrase;
}

如果我删除上面的部分,我总是会得到“是”。

main中的测试代码为

if(test.Palindrome::isPalindrome() == 1){
    cout<<"Yes"<<endl;
}
else {
    cout<<"No"<<endl;
}

还有一个问题。我尝试更改上述代码的小写字母,但出现错误。有人知道会发生什么吗?新代码来自https://www.geeksforgeeks.org/conversion-whole-string-uppercase-lowercase-using-stl-c/

之前

 void Palindrome::lowerCase()
{
    for (int i=0; i<phrase.length(); i++)
    {
        phrase[i] = tolower(phrase[i]); 
    }
}

之后

void Palindrome::lowerCase(){

transform(phrase.begin(), phrase.end(), phrase.begin, ::tolower);

}

有人可以向我解释吗?非常感谢!

2 个答案:

答案 0 :(得分:2)

有多个using System.IO; var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location.Substring(0, Assembly.GetEntryAssembly().Location.IndexOf("bin\\"))) isdigitispunct函数-在isspace头文件的全局命名空间中,在<ctype.h>命名空间的多个函数中在std<cctype>标头中。以<clocale>开头表示您要使用全局命名空间中的内容。

您需要使用::而不是<string>才能使用<string.h>类。

假设std::stringtest对象,则Palindrome应该只是test.Palindrome::isPalindrome()

如果省略test.isPalindrome()构造函数,则Palindrome成员将保持空白,并且您的phrase实现将返回isPalindrome()的空白true({{ 1}}为0),因为phrase循环无需检查。从技术上讲这是正确的-空字符串是回文。

答案 1 :(得分:0)

{{ action.text|truncatechars:200 }} 表示您正在使用::以及其他来自全局命名空间的文件。 isdigit是其他头文件的一部分,例如isdigit