使用带有字符串指针的 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&amp; c : input_phrase) c = tolower(c); 。请注意,我这次使用了参考(char &)!因为这是一个练习,剩下的就交给你了……

以上是关于使用带有字符串指针的 isalpha 函数的主要内容,如果未能解决你的问题,请参考以下文章

isalpha()函数~tolower()函数

使用带有字符指针的 RAII

Python---基础----数据类型的内置函数

c++ isalpha 查找表

如何创建带有参数的成员函数指针数组?

isalpha()方法