使用带有字符串指针的 isalpha 函数
Posted
技术标签:
【中文标题】使用带有字符串指针的 isalpha 函数【英文标题】:Using isalpha function with string pointers 【发布时间】:2016-07-21 14:40:15 【问题描述】:嘿,我对编程很陌生,在我的程序中使用 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;
【问题讨论】:
那么问题出在哪里?哪里有问题?为什么你认为我们必须阅读所有代码?你能调试你的程序吗?您能否删除所有不需要的代码并发布minimal reproducible example? 我相信你要分配的是char[size_new_Array]
,肯定不是string[size_new_Array]
? std::string 是多个字符的集合,您可以使用字符串数组,就好像 1 个字符串代表 1 个字符一样。动态分配是否需要?因为在这里使用一个简单的字符串就足够了。
您可能只需要更好地了解std::string
究竟是什么。
如果我使用它,我必须将所有字符串*更改为 char*?不,不需要动态分配。使用一个简单的字符串是什么意思? @AdnanElezovic
@JimmyKelly 要从 std::string
访问单个字符,请使用 indexingoperator[]
函数。
【参考方案1】:
我发现确定字符串是否为回文的最佳方法是从两侧向中心走去。在你的情况下,我会选择像这样跳过非字母字符。
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;
如果您必须先保存输入并删除非字母字符,我会这样做。
string remove_non_alpha(string mystring)
string ret_string = "";
for (int i = 0; i < mystring.length(); i++)
if (isalpha(mystring[i]))
ret_string += tolower(mystring[i]);
return ret_string;
然后将结果输入到上面的函数中。
【讨论】:
这真的很有帮助!非常感谢!【参考方案2】:抱歉,您太辛苦了,但是您尝试复制的内容太多了。在检索数据后,您可以通过一个循环实现所有这些,并且所有这些都在一个字符串对象上(除非您想将原始输入保留用于其他目的):
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))
基本检查,当前字符是否为字母字符?
*pos++ = tolower(c);
如果是这样,请立即将其转换为小写。将其分配到当前字符串位置,并推进“指针”(迭代器!)。
input_phrase.erase(pos, input_phrase.end());
最后,删除剩余的被多余字符占据的字符串部分。您可能会注意到,您可能想保留一些字符,但您已经将这些字符复制到了更左侧的位置......
【讨论】:
这太棒了!但是对于这个练习,我需要有单独的函数来删除所有非字母字符,将所有内容转换为小写,最后检查短语是否是回文。 @阿空加瓜 好的,为了只保留 alpha,使用上面的代码,跳过对tolower
的调用。转换为 lower then 会在一个单独的函数中获得一个单独的循环,它仍然可以对原始字符串进行操作:for(char& c : input_phrase) c = tolower(c);
。请注意,我这次使用了参考(char &)!因为这是一个练习,剩下的就交给你了……以上是关于使用带有字符串指针的 isalpha 函数的主要内容,如果未能解决你的问题,请参考以下文章