嘿,我对编程很新,我在程序中使用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;
}
答案 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());
最后,删除剩余部分占用剩余字符的字符串。您可能会注意到,您可能希望保留一些字符,但是您已将这些字符复制到左侧更多位置...