2016-08-08 61 views
1

Ich brauche Hilfe Leerzeichen und Sonderzeichen aus einem Char-Array zu entfernen. Das Problem, das ich laufe, ist, dass die Löschfunktion nur auf String-Datentypen funktioniert, wenn ich mich nicht irre . Die Zuweisung erfordert ein Char-Array, keine Zeichenfolge, also kann ich sie nicht einfach konvertieren oder habe eine String-Variable. Ich habe versucht, es nachzuschlagen, aber alles mögliche schlägt nur vor, es in eine Zeichenkette umzuwandeln oder als Schnur anzufangen, die ich nicht tun kann. Ich bin neu in der Programmierung und Zeiger sind ein bisschen komisch für mich, wenn die Antwort offensichtlich ist, tut es mir leid. Vielen Dank an alle, die Ihnen geholfen haben.Entfernen/Löschen von Zeichen aus Char-Array [] mit Zeigern

#include "stdafx.h" 
#include <iostream> 
#include <stdio.h> 
#include <string> 
#include <stdlib.h> 
#include <ctype.h> 
using namespace std; 

     int main() 
     { 
      const int SIZE = 80; 
      char str[SIZE]; 
      char* strPtr; 
      int strlength; 
      int j = 0; 
      int front = 0, back; int flag = 1; 

      strPtr = str; 

      cout << "This program checks for palidromes." << endl; 
      cout << "Please enter a phrase." << endl; 
      cout << endl; 
      cin.getline(str, SIZE); 

      //Get the length of string str 

      strlength = strlen(str); 

      //Convert all the characters in the string str to uppercase 
      for (int i = 0; i < strlength; i++) 
      { 
       if (!isupper(str[i])) 
        str[i] = toupper(str[i]); 
      } 

      //Remove all the special characters except letters a - z 
      for (int i = 0; i < strlength; i++) 

       if (!isalpha(str[i])||(!isalnum(str[i]))) 
       { 
        str.erase(str[i]); // need help here. Not sure how to go about it. 
       } 

      //str[j] = '\0'; 

      return 0; 
     } 

Antwort

3
char* tail = std::remove_if(str, str + strlength, 
    [](char c){ return !isalpha(c)||(!isalnum(c)); }); 
strlength = tail - str; 
*tail = 0; 
+0

Ich mag eigentlich die Verwendung von Lambdas hier. +1 –

2

Die andere Antwort Punkte, die Sie richtig std::remove_if, aber ich vermute, dass Sie wirklich verstehen wollen, wie die Entfernung selbst zu implementieren, anstatt das Problem auf der C++ Bibliothek von Dumping. Auch Ihr eigener Versuch konvertiert dabei alle verbleibenden Zeichen in Großbuchstaben, was die andere Antwort nicht tut.

Das ist eigentlich einfacher als Sie vielleicht denken. Die entsprechenden Bits sind wie folgt:

char *p=str, *q=str; 

while (*p) 
{ 
    if (isalpha(*p)) 
     *q++=toupper(*p); 

    ++p; 
} 

*q='\0'; 

Für den Anfang gibt es keine Notwendigkeit strlen() dieser Zeichenfolge zu berechnen. Einfach einen Zeiger vom Anfang der Zeichenfolge bis zum Ende zu iterieren, bis er auf das abschließende '\ 0' zeigt, ist ausreichend.

Das wäre der Zeiger. beginnt am Anfang der Zeichenfolge, und jede Iteration der while Schleife inkrementiert es, mit der while Schleife bei der \0 stoppen.

Dann, wenn Zeichen alphabetisch ist, wird es auf den q Zeiger kopiert, wandelt es in Großbuchstaben und den q Zeiger auch voran.

Als solche werden nur alphabetische Zeichen nach q kopiert, alles andere wird übersprungen.

q beginnt mit dem Zeigen auf den gleichen Puffer wie p, der Puffer mit der Zeichenfolge. Wenn die Zeichenfolge mit alphabetischen Zeichen beginnt, ist das einzige, was passieren wird, dass jedes Zeichen über sich selbst kopiert wird, wobei sowohl als auch q zusammen voranschreiten. Sobald ein nicht-alphabetisches Zeichen anzeigt, wird es weitergeführt, aber q wird "zurückgelassen" und sammelt nur noch die verbleibenden alphabetischen Zeichen. Und wenn alles erledigt ist, wird das '\ 0' in q geschrieben und die neue Großbuchstaben-Zeichenfolge wird beendet.

Der einzige wirklich schwierige Teil davon ist zu verstehen, warum alles genau in der Reihenfolge geschehen muss; d. h. das alphabetische Zeichen muss kopiert werden, bevor inkrementiert wird, usw. ... Talk to your rubber duck, wenn Sie nicht verstehen, warum, wird Ihnen Ihre Gummiente das erklären.