Wątek przeniesiony 2016-07-27 13:54 z C/C++ przez ŁF.

find nie może znaleźć kilku znaków

0

Witam chce by mój program wczytywał z pliku dane (10 słów) później je przypisuje do vectora a następnie ma je sprawdzić czy nie mam tam na takich znaków jak *, $, % itd. I jak na takie coś natrafi to ma ma skasować dany vector. I tu pojawia się mój problem z find. Mianowicie ma błąd konwertowania.

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <fstream>
#include <cstdlib>

using namespace std;


void openFile ( fstream& file );       //zaladowanie pliku
vector<string> assignment ( fstream& file );
void checkingValues ( vector<string> finishWords );


int main()
{
    fstream file;

    openFile( file );
    vector<string> finishWords =  assignment( file );
    for (int i =0 ; i < finishWords.size() ; ++i)
    {
        cout << "to sa moje slowa " << finishWords[i] << endl;
    }
    checkingValues( finishWords );
    return 0;
}

//==========================================================================================

void openFile( fstream& file )
{
    file.open( "dane.txt" , ios::in );
    if ( file.good() == false )
    {
        cout << "Plik nie istnieje" << endl;
    }
}
//==========================================================================================
vector<string> assignment( fstream& file )
{
    string line;
    vector<string> words;
    while( getline( file , line ) )
    {
        words.push_back(line);
    }
    return words;
}
//==========================================================================================
void checkingValues ( vector<string> finishWords )
{
//    char copyTab[10];
    for ( int i = 0 ; i < finishWords.size() ; ++i )
    {
        if ( find( finishWords.begin() ,  finishWords.end() , '!' || '@' || '#' || '$' || '%' || '^' || '&' || '*' ) )
        {
            finishWords.erase(finishWords.begin()+i);
        }
//        copyTab = finishWords[i];
    }
}

Najpierw chciałem do tablicy char skopiować każdą daną po kolei i ja sprawdzać do tab[0] do tab[9] ale nie mogłem skopiować vectora do tablicy.

1
copyTab = finishWords[i]; 

Tak nie skopiujesz do tablicy. W pętli znak po znaku, lub skorzystaj z funkcji std::copy()

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    string word{ "bbbaaa" };
    char cWord[7];
    copy(word.begin(), word.end(),
        cWord);
    cWord[6] = '\0';
    cout << cWord << '\n';
} 
0

Ok sprawdzę to ale wiesz może o co chodzi z tym find?

1

find_first_of()

find( finishWords.begin() ,  finishWords.end() , '!' || '@' || '#' || '$' || '%' || '^' || '&' || '*' )  

Trzeci argument jest niepoprawny.
Jeśli chcesz coś podobnego, użyj funkcji find_if() i w trzecim argumencie podaj predykat (lambda lub funkcja). Polecam jednak funkcję z linka.

1

Źle nazywasz funkcje, to utrudnia czytanie. Ten "assignment" jest doskonałym przykładem.
http://ideone.com/5oKQVN

1

Problemem jest też pętla for, w której usuwasz elementy. Usuwając element z wektora, automatycznie zmieniasz mu rozmiar. To chyba jasne. Ponadto wszystkie elementy po elemencie usuniętym dostają indeksy o jeden mniejsze. Jednak Ty za każdym razem zwiększasz "i" w pętli. To na pewno nie będzie działać prawidłowo, poza tym jest bardzo blisko katastrofy. Jeśli usuwasz elementy z tablicy/wektora w pętli, to posłuż się pętlą while. Tutaj masz wpływ na inkrementację licznika. Inkrementujesz go TYLKO wtedy, kiedy nie usunąłeś żadnego elementu w danym przebiegu.

0

Bardzo wszystkim dziękuje szczegulnie carlosmay za funkcje find_first_of i Juhas za to że mie powiedział że mam złą pętle, wielkie dzięki chłopaki. Funkcja wygląda tak:

vector<string> checkingValues ( vector<string> finishWords )
{
    int start = 0 ;
    string wordWithVector;
    while ( start < finishWords.size() )
    {
        wordWithVector = finishWords[start];
        size_t found = wordWithVector.find_first_of("!@#$%^&*()_+|");
        if ( found != string::npos )
        {
            finishWords.erase(finishWords.begin()+start);

        }
        else
            start++;
    }
    return finishWords;
} 

I jeszcze jedna użytkownik MarekR22 napisał że źle opisałem funkcje assignment czy ktoś może mi podpowiedzieć inna nazwę dla tej funkcji po angielsku bo ja tą nazwę znalazłem w słownikach.

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