使用isalpha函数和字符串指针

时间:2016-07-21 14:40:16

标签: c++ string class object palindrome

嘿,我对编程很新,我在程序中使用isalpha函数时遇到了麻烦。这是回文类的一部分代码。我要做的是从输入中删除所有非字母字符。因此,如果用户输入“嗨,你好吗”,我需要首先计算只有字母数组的大小然后在我的removeNonLetters子类中,我需要摆脱非字母字符。有人可以帮我这个。非常感谢!

#include <iostream>
#include <string>
#include <stdio.h>
#include <algorithm>
#include <cctype>
#include <cstring>
#include <ctype.h>

using namespace std;

class palindrome
{
private:
int only_letters_size;
string input_phrase;
string* only_letters;

public:
string inputPhrase();
string removeNonLetters();
string* new_Array;
int size_new_Array;
};

string palindrome::inputPhrase()
{
cout << "Input phrase: "; //asks the user for the input
getline(cin,input_phrase);


size_new_Array = input_phrase.length(); //creating a dynamic array to store    
the input phrase

new_Array = new string[size_new_Array];
int i;

for (i=0; i<size_new_Array; i++)
{
  new_Array[i]=input_phrase[i];
}

only_letters_size = 0;

while(new_Array[i])
{

  if (isalpha(new_Array[i])) //PROBLEM OCCURS HERE
  {
      only_letters_size=only_letters_size+1;
  }

}

cout << only_letters_size << endl;
return new_Array;
}

string palindrome::removeNonLetters()
{
 int j=0;
 int str_length = new_Array.length(); //string length
 only_letters = new string[only_letters_size];

 for (int i=0;i<size_new_Array;i++)  //PROBLEM OCCURS HERE AS WELL
 {
    if (isalpha(new_Array[i]))//a command that checks for characters
    {
        only_letters[j] = new_Array[i];//word without non alphabetical    c            
  characters is stored to new variable
        j++;
    }
  }
  cout << only_letters << endl;
  return only_letters;

 }

2 个答案:

答案 0 :(得分:1)

我发现确定弦是否是回文的最佳方法是从两侧走向中心。在您的情况下,我只会选择跳过非字母字符,如此。

rebase continue

如果你必须先保存输入并删除非alpha字符,我会这样做。

bool is_palindrome(string mystring)
{
    int start = 0, end = mystring.length() - 1;
    while (start < end)
    {
        // Skip over non-alpha characters
        while (!isalpha(mystring[start]))
        {
            start++;
        }
        while (!isalpha(mystring[end]))
        {
            end--;
        }

        if (tolower(mystring[start]) != tolower(mystring[end]))
        {
            return false;
        }
        else
        {
            start++;
            end--;
        }
    }

    return true;
}

然后将结果提供给上面的函数。

答案 1 :(得分:0)

很抱歉这很难,但是你在尝试过多的复制。在检索数据和所有单个字符串对象之后,您可以通过一个循环实现所有这些(除非您希望将原始输入保留用于其他目的):

getline(cin,input_phrase);
std::string::iterator pos = input_phrase.begin();
for(char c : input_phrase)
{
    if(isalpha(c))
    {
        *pos++ = tolower(c);
    }
}
input_phrase.erase(pos, input_phrase.end());

之后,你的字符串就可以使用......

说明:

std::string::iterator pos = input_phrase.begin();

迭代器类似于指向字符串内部数据的指针。我们保持位置将仅alpha字符移动到,跳过非alpha字符。

for(char c : input_phrase)

简单地遍历所有角色......

if(isalpha(c))

基本检查,当前字符是alpha字符吗?

*pos++ = tolower(c);

如果是这样,请立即将其转换为小写。将其分配给当前字符串位置,并前进&#34;指针&#34; (迭代!)。

input_phrase.erase(pos, input_phrase.end());

最后,删除剩余部分占用剩余字符的字符串。您可能会注意到,您可能希望保留一些字符,但是您已将这些字符复制到左侧更多位置...