Sprawdzanie powtórzenia wyrazów

0

Witam,
chciałem napisać sobie program w którym sprawdzam czy wyraz się powtórzył w danym zdaniu , wtedy zmieniam kolor konsoli. Napisałem na razie coś takiego :
Wiem troche brzydki kod ale cóż.

HANDLE hOut;

std::string text;

std::cout << "Write text : ";

getline( std::cin, text );

std::vector < std::string > splited = split( text, ' ' );

std::vector < std::string > text2;

if( splited.empty() )
{
    std::cout << "You didn't wrote any text ! " << std::endl;
}

for( int i = 0; i < splited.size(); i++ )
{
    if( i > 0 )
    {
        text2.push_back( splited[ i - 1 ] );
    }
    
    for( int j = 0; j < text2.size(); j++ )
    {
        hOut = GetStdHandle( STD_OUTPUT_HANDLE );
        
        if( text2[ j ] == splited[ i ] )
             SetConsoleTextAttribute( hOut, FOREGROUND_RED );
        
        std::cout << text2[ i ] << " ";
    }
    
}

Tylko mam jeden problem . Gdy wpisze np : "Bardzo dlugie dlugie zdanie " . To dostaje potem całe rozwalone zdanie . Wiem ,że dzieje się to tak dlatego , że są dwie pętlę. Ale jakoś nie mam pomysłu , żeb. to napisać inaczej. Jakieś propozycje??
Edytuj

0

Tutaj napisałem na szybko wykrywanie powtórzeń w zdaniu pobieranym z klawiatury. Może Ci się przyda. Co do koloru konsoli to nie wiem.

#include <sstream>
#include <string>
#include <iostream>
#include <list>
#include <set>
using namespace std;

int main() 
{
	string wejscie="";
	getline(cin, wejscie);
   
	list<string> split;
	set<string> powt;
	stringstream str(wejscie);
	
	while(!str.eof()) {
		string temp;
		str >> temp;
		split.push_back(temp);
		powt.insert(temp);
	}
	
	if(powt.size() != split.size())
		cout << "Wystapily powtorzenia.\n";
	else cout << "Bez potworzen.\n";
	
	return 0;
}

https://ideone.com/EZeQek

1
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;

int main() 
{
	vector<string> words;
	copy(istream_iterator<string>(cin), istream_iterator<string>(), back_inserter(words));
	sort(begin(words), end(words));
	
	auto repeatedWord = adjacent_find(begin(words), end(words));
	while (repeatedWord != end(words))
	{
		cout << *repeatedWord << endl;
		auto differentWord = find_if(repeatedWord, end(words), 
							 [repeatedWord](const string& s) { return s != *repeatedWord; });
		repeatedWord = adjacent_find(differentWord, end(words));
	}
	
	return 0;
}

http://ideone.com/E6wCKK

2

set<string> i sprawdzanie czy element juz istnieje? ;]

0

Widzę , że piszecie o funkcjach których ja z większości nie znam . Chyba muszę się douczyć . A poza tym ten kod co dwie osoby wstawiły i tak nie rozwiązuje mojego problemu.

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