C++ 如何从字符数组中删除标点字符?

C++ 如何从字符数组中删除标点字符?,c++,arrays,string,visual-studio,char,C++,Arrays,String,Visual Studio,Char,我的程序提示用户输入一个短语来检查它是否是回文,然后它应该打印出没有大写或特殊字符的短语,比如" ' , ? 我的问题是删除那些字符。我让我的程序忽略了它们我在问我该如何删除它们?我在我认为该声明的地方发表了评论。示例输出应该是:“夫人,我是亚当”到“夫人” #包括 #包括 #包括 使用名称空间std; int main() { //变量和数组 int const index=80; 字符短语[索引]; 字符新短语[索引]; int i,j,k,l; 布尔检验=真; //提示用户输入短语/单词

我的程序提示用户输入一个短语来检查它是否是回文,然后它应该打印出没有大写或特殊字符的短语,比如" ' , ? 我的问题是删除那些字符。我让我的程序忽略了它们我在问我该如何删除它们?我在我认为该声明的地方发表了评论。示例输出应该是:“夫人,我是亚当”到“夫人”

#包括
#包括
#包括
使用名称空间std;
int main()
{
//变量和数组
int const index=80;
字符短语[索引];
字符新短语[索引];
int i,j,k,l;
布尔检验=真;
//提示用户输入短语/单词
不能修改此行:

if(Phrase[k] != ' ')
将是:

if((phrase[k] != ' ') && (ispunct(phrase[k]) == false))
这意味着我们同时检查空格和标点符号


也可以考虑改写:

if(NewPhrase[i] == NewPhrase[j])
        {;}
        else
        {
            test = false;
        }
因此:

if(NewPhrase[i] != NewPhrase[j])
   test = false;
修改此行:

if(Phrase[k] != ' ')
将是:

if((phrase[k] != ' ') && (ispunct(phrase[k]) == false))
这意味着我们同时检查空格和标点符号


也可以考虑改写:

if(NewPhrase[i] == NewPhrase[j])
        {;}
        else
        {
            test = false;
        }
因此:

if(NewPhrase[i] != NewPhrase[j])
   test = false;
以下是建议:

  • 使用
    std::string
  • 用于确定字符串中的字符是否为标点符号
  • 使用该选项删除标点符号
  • 这是一行代码(加上一行额外的代码以方便lambda):

    std::字符串短语=。。。。。;
    自动isPunct=[](字符c){return std::isPunct(static_cast(c));}
    phrase.erase(std::remove_if(phrase.begin()、phrase.end()、ispunt),
    短语.end());
    
    下一步,从另一个衬里转换为小写:

    std::transform(phrase.begin(), phrase.end(), phrase.begin(),
                   [](char c)
                   { return std::tolower(static_cast<unsigned char>(c));});
    
    std::transform(phrase.begin()、phrase.end()、phrase.begin(),
    [](字符c)
    {return std::tolower(static_cast(c));};
    
    以下是建议:

  • 使用
    std::string
  • 用于确定字符串中的字符是否为标点符号
  • 使用该选项删除标点符号
  • 这是一行代码(加上一行额外的代码以方便lambda):

    std::字符串短语=。。。。。;
    自动isPunct=[](字符c){return std::isPunct(static_cast(c));}
    phrase.erase(std::remove_if(phrase.begin()、phrase.end()、ispunt),
    短语.end());
    
    下一步,从另一个衬里转换为小写:

    std::transform(phrase.begin(), phrase.end(), phrase.begin(),
                   [](char c)
                   { return std::tolower(static_cast<unsigned char>(c));});
    
    std::transform(phrase.begin()、phrase.end()、phrase.begin(),
    [](字符c)
    {return std::tolower(static_cast(c));};
    
    为什么不将第一个循环中的字符作为空格删除?为什么不将第一个循环中的字符作为空格删除?可能重复?我尝试了这个方法,效果很好,非常感谢:)我现在可以删除那些while循环中的其他语句没有问题!向上投票/接受,如果我回答了你的问题。A此外,还可以进一步压缩代码……您可以检查回文,同时忽略字符。这样就不需要一些循环,也不需要额外的循环array@MikeChristiansen就像在NewPharse中一样,在字符串tali尝试了这个方法之后,我得到了垃圾值,它成功了,非常感谢:)我可以删除其他的while循环的语句现在没有问题!如果我回答了你的问题,请向上投票/接受。此外,还可以进一步压缩代码……你可以检查回文,同时忽略字符。不再需要一些循环,也不需要额外的循环array@MikeChristiansen就像在纽法尔一样,我得到的是垃圾值很好!!顺便说一句,你解决了我的相关问题很好!!顺便说一句,你解决了我的相关问题