2016-08-08 14 views
1

char配列から空白や特殊文字を削除する手助けが必要です。私が間違っていない場合、erase関数は文字列データ型でのみ機能します。私はそれを変換することはできませんまたは文字列変数を持つ文字列ではない文字配列の代入を呼び出します。私はそれを探してみましたが、それは文字列に変換するか、文字列として開始することを示唆しています。私はプログラミングに慣れておらず、ポインタは私にとっては少し変わっているので、答えが明らかであれば私はごめんなさい。助けてくださったみなさん、ありがとうございました。ポインタを使用してchar配列[]から文字を削除/削除する

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

答えて

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

私は実際にラムダの使用が好きです。 +1 –

2

他の答えが正しくstd::remove_ifにあなたを指しますが、私の代わりにC++ライブラリでの問題をダンプするの、あなたが本当に除去を自分で実装する方法を理解したいと思われます。また、これであなた自身の試みは、残りのすべての文字を大文字に変換します。これは他の答えではできません。

これは実際に考えるよりも簡単です。手始めに

char *p=str, *q=str; 

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

    ++p; 
} 

*q='\0'; 

を、この文字列のstrlen()を計算する必要はありません:関連ビットは次のとおりです。文字列の先頭から最後までポインタを繰り返して、終端の '\ 0'を指すようにするだけで十分です。

これは、pポインタです。 pは文字列の先頭から開始し、whileループの各反復はそれをインクリメントし、whileループは\0に停止します。

pの文字がアルファベットの場合は、qポインタにコピーされて大文字に変換され、qポインタも前進します。

このように、アルファベット文字のみがqにコピーされ、それ以外はすべてスキップされます。

qは、pと同じバッファを指し始めます。バッファには文字列が入ります。文字列がアルファベット文字で始まる場合、起こる唯一のことは、各文字がそれ自身の上にコピーされ、pqが一緒に進むことです。 pはアルファベット以外の文字が表示されるとすぐに進みますが、qは "left behind"です。残りのアルファベット文字のみが蓄積され続けます。すべてが完了すると、 '\ 0'はqに書き込まれ、新しい大文字のみの文字列が終了します。

この中で唯一本当に難しい部分は、すべてがシーケンス内で正確に発生しなければならない理由を理解することです。つまり、pが増加するなどの前にアルファベットの文字をコピーする必要があります。Talk to your rubber duck、理由を理解できない場合は、あなたのラバーダックがあなたに説明します。

関連する問題