Usuwanie jednakowych liter z tekstu

2015-01-19 21:37
0

Mam prosty program do napisania, ma wczytac tekst od uzytkownika a nastepnie usunac z niego litere 'a'.

Program się kompiluje i w sumie działa, ale tylko dla jednego wyrazu. Np.

I: 'Ala ma kota'
O: 'l ma kota'

Dla 'ma' i 'kota' juz nie dziala... Pewnie coś w tej pętli popsułem, macie pomysły jak to naprawić?


#include <iostream> 
#include <string> 

using namespace std; 

void usunL(string &tekst, char c) 
{
   size_t pozycjaL = tekst.find(c); 

   if(pozycjaL == string::npos) 
      cout << "Nie ma w ogole takiej litery w tekscie!" << endl; 
   else 
     do{
         tekst.erase(pozycjaL, pozycjaL); // usuwanie literki 
         pozycjaL = tekst.find(c, pozycjaL + 1); // przesuwam miejsce od ktorego zaczyna szukac petla literki
         }while(pozycjaL  == string::npos)   
     cout << tekst; 

} 

int main()
{
   string tekst; 
   char c = 'a'; 

   getline(cin, tekst); 
   usunL(tekst, c); 
   return 0; 
} 
Nie używaj prefiksów/postfiksów w tytułach wątków - od podawania nazwy języka/technologii są tagi; - furious programming 2015-01-19 23:30

Pozostało 580 znaków

2015-01-19 22:05
2
while(pozycjaL  != string::npos)

oraz

tekst.erase(pozycjaL, 1);
edytowany 1x, ostatnio: twonek, 2015-01-19 22:09
@twonek Nie działa, np. dla drugiego wyrazu ktory zawiera litere a, usuwa całość która występuju po niej. balon balon - blon b - mike_mikey 2015-01-19 22:09
bo usuwasz za dużo, patrz na edytowany post - twonek 2015-01-19 22:11
@twonek, dzięki. Faktycznie, błąd tkwił w dwóch miejscach ostatecznie. Wielkie dzięki za rozwiązanie :) - mike_mikey 2015-01-19 22:14

Pozostało 580 znaków

2015-01-19 22:08
1
size_t pos;
while((pos = tekst.find(c)) != string::npos) tekst.erase(pos, 1);
edytowany 1x, ostatnio: ly000, 2015-01-19 22:09

Pozostało 580 znaków

2015-01-19 22:21
0
#include <iostream>
#include <string>
using namespace std; 

bool removeChar(string &str,char ch) 
  {
   size_t len=str.length();
   for(size_t prev=0,pos;(pos=str.find(ch,prev))!=string::npos;prev=pos) str.erase(pos,1);
   return len!=str.length();
  }

int main()
  {
   string line; 
   getline(cin,line); 
   if(removeChar(line,'a')) cout<<line<<endl;
   else cout<<"Nie ma w ogole takiej litery w tekscie!"<<endl; 
   return 0; 
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-19 22:37
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>

using namespace std;
void usunL(string &tekst, char c)
{
    string result;
    remove_copy_if(begin(tekst), end(tekst), back_inserter(result), bind1st(equal_to<char>{}, c));
    tekst = result;
}
@Azarien, piękny kod muszę przyznać. Ale nie wiem czy przypadkiem nie wykorzystuje jakiś elementów C11, bo kompilatorowi sie nie widzi uzywanie begin i end... dosyc dziwne, no ale. - mike_mikey 2015-01-19 23:06
C++11, jeśli już. nie wiem czy wykorzystuje, pod VS2013 działa, ale on nie rozróżnia czy coś jest z C++11 czy nie jest. pod GCC może być potrzebne --std=c++11 - Azarien 2015-01-19 23:36

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0