2016-07-21 12 views
-2

Hey Ich bin ziemlich neu in der Programmierung und ich habe Probleme mit der Isalpha-Funktion in meinem Programm. Dies ist ein Teil des Codes für eine Palindrom-Klasse. Ich versuche, alle nicht alphabetischen Zeichen aus der Eingabe zu entfernen. Wenn also der Benutzer "Hi, How are you" eingibt, muss ich zuerst die Größe des Arrays nur der Buchstaben zählen, dann muss ich in meiner removeNonLetters-Unterklasse die nicht alphabetischen Zeichen loswerden. Kann mir bitte jemand dabei helfen? Ich danke dir sehr!Verwendung der Isalpha-Funktion mit String-Pointern

#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

Also, was ist das Problem? Wo ist das Problem? Warum denkst du, wir müssen den ganzen Code lesen? Könnten Sie bitte Ihr Programm debuggen? Könnten Sie bitte alles unnötigen Code entfernen und ein [MCVE] veröffentlichen? –

+0

Ich glaube, was Sie zuordnen wollten ist 'char [size_new_Array]', und sicher nicht 'string [size_new_Array]'? std :: string ist eine Sammlung von mehreren Zeichen, und Sie verwenden ein Array von Strings, als ob 1 String 1 Zeichen entspricht. Ist eine dynamische Zuordnung ** erforderlich **? Denn hier wäre eine einfache Zeichenfolge ausreichend. –

+0

Wahrscheinlich müssen Sie einfach ein besseres Verständnis dafür erreichen, was ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string) eigentlich ist. –

Antwort

0

Sorry für hart, aber Sie versuchen viel zu viel kopieren herum. Sie können all dies mit einer einzigen Schleife erreichen nach dem Abrufen von Daten und alle auf einem einzigen String-Objekt (es sei denn, Sie die ursprüngliche Eingang für einige andere Zwecke behalten wollen):

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()); 

Danach wird die Zeichenfolge bereit zu verwenden, um ...

Erläuterung:

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

ein Iterator etwas ähnliches als ein Zeiger auf die internen Daten des Strings. Wir behalten die Position, um nur Alpha-Zeichen zu bewegen, und überspringen die Nicht-Alpha-Zeichen.

for(char c : input_phrase) 

einfach alle Zeichen iterieren ...

if(isalpha(c)) 

Der wesentliche Kontrolle, ist das aktuelle Zeichen ein alpha one?

*pos++ = tolower(c); 

Wenn ja, konvertieren Sie es sofort in Kleinbuchstaben. Weisen Sie sie der aktuellen Zeichenfolgenposition zu und stellen Sie den "Zeiger" (Iterator!) Vor.

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

Und zuletzt den verbleibenden Teil der Zeichenfolge, die mit überflüssigen Zeichen belegt ist, löschen. Sie könnten beachten, dass es einige Zeichen geben könnte, die Sie behalten wollten, aber Sie kopierten diese an eine Position weiter links ...

+0

Das ist großartig! Aber für diese Übung brauche ich separate Funktionen, um alle nicht-alphabetischen Zeichen zu entfernen, alles in Kleinbuchstaben umzuwandeln und schließlich zu prüfen, ob die Phrase ein Palindrom ist. @Aconcagua –

+0

OK, um nur Alpha zu behalten, benutze den obigen Code und überspringe den Aufruf von "tolower". Konvertiert nach low erhält dann eine separate Schleife in einer separaten Funktion, die immer noch mit der ursprünglichen Zeichenfolge arbeiten kann: 'for (char & c: input_phrase) {c = tolower (c); } '. Beachten Sie, dass ich dieses Mal eine Referenz (Char ** & **) verwendet habe! Da dies eine Übung ist, überlasse ich es dir, den Rest zu teilen ... – Aconcagua

1

Ich habe den besten Weg gefunden festzustellen, ob eine Zeichenfolge ein Palindrom ist von beiden Seiten zur Mitte gehen. In Ihrem Fall würde ich einfach so entscheiden, Nicht-Alpha-Zeichen zu überspringen.

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; 
} 

Wenn Sie die Eingabe zuerst speichern und nonalpha Zeichen entfernen müssen, würde ich es so machen.

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; 
} 

Und dann füttern Sie das Ergebnis in die obige Funktion.

+0

Das hilft wirklich! Ich danke dir sehr! –

+0

Kein Problem. Darf ich Sie bitten, diese Antwort als akzeptiert zu markieren? – DeepDeadpool

Verwandte Themen