szukanie ciągu znaków w tekście - string

0

Witam!

Mam za zadanie znaleźć w podanym tekście wprowadzonym przez użytkownika jakiś ciąg znaków np: "abc" lub inny wyraz. Próbowałem już wieloma sposobami ale mi nie działa obecnie stanąłem na sposobie z findem, ale albo coś źle zrobiłem albo on tez jest zły ;/ Proszę o jakieś wskazówki lub coś w ten deseń.

__ To jest tylko część kodu bo cały kod jest długi.__

                                    int ile_c=0;
                                    string tekst,ciag;

                                    cout <<"jaki ciag znakow ma byc szukany: "; cin>>ciag;

                                    ifstream mojplik(dokument);
                                    if (!mojplik)
                                    {
                                    cout << "Nie mozna otworzyc pliku do czytania";
                                    cout<<"\n\n";

                                    return 0;
                                    }

                                    while (mojplik.good())
                                    {
                                    getline(mojplik, tekst);

                                    if(tekst.find(ciag))
                                    ile_c++;
                                    }
                                    mojplik.close();
                                    cout << "W pliku: " <<dokument<<",jest  "<< ile_c << " cigow o wyrazach : "<<ciag<<endl;

Pozdrawiam i czkam na odp.

1

Funkcja find ze klasy string jeśli nie znaleziono stringu zwraca npos a jeśli znaleziono string zwraca jego pozycję w ciągu. Całość powinna wyglądać tak:

/* 
 * File:   main.cpp
 * Author: Administrator
 *
 * Created on 25 grudzień 2012, 14:14
 */

#include <iostream>
#include <string>

int main()
{
    std::string ciag;
    std::string szukany;
    
    std::getline(std::cin,ciag);
    std::cin >> szukany;
    
    int ile = 0;
    size_t pos = 0;
    

        for(;;pos += szukany.length()) {
                pos = ciag.find(szukany,pos);
                
                if(pos != std::string::npos) {
                    ile++;
                } else {
                    break;
                }
                
        }
 
    
    std::cout << "wyraz "<<szukany<<" wystapil: "<<ile;
 
    
    std::cin.get();
    std::cin.get();
}
 
0

Sprawdzałeś debuggerem co zawierają porównywane ciągi? Obstawiam, że jakieś \0 albo \r\n wszystko chrzani.

Poza tym nie wiem jak z tym while-em, wystarczy tam

while (getline(mojplik, tekst))

no może z whilem da się krócej zapisać ale nie o to chodzi, nie szukam krótszego zapisu tylko poprawnego rozwiązania ;/

//edit:
dzięki robcio przeanalizuje sobie to i pozmieniam :)

0
    int ile = 0;
    size_t pos = 0;
       for(;;pos += szukany.length()) {
                pos = ciag.find(szukany,pos);
 
                if(pos != std::string::npos) {
                    ile++;
                } else {
                    break;
                }
        }

Trochę przesadziłeś, da się ładniej:

int counter = 0;
for (int pos = 0; pos != std::string::npos; counter++) {
    pos = foo.find(what, pos + what.size());
}

No ale pomysł dobry ;].

0

witam ponownie! Próbowałem zmienić program, deko zmieniłem pod potrzeby mojego całego projektu ale dalej w tym co nadpisał robcio jest błąd, szukało tej frazy tylko w pierwszej linijce ciągu, a jak chcesz wczytywać z pliku to szuka tylko w 1 linijce,a drugie i nastopnej już nie co zmienić?? (przerobiłem tak żeby program działał już)

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
int ile_c=0;
size_t pos = 0;
char dokument[255];
string tekst;
string ciag;
cout <<"podaj nazwe pliku tekstowego z ktorego ma byc wczytany tekst: "; cin>>dokument;

cout <<"jaki ciag znakow ma byc szukany: "; cin>>ciag;
ifstream mojplik(dokument);
if (!mojplik)
{
cout << "Nie mozna otworzyc pliku do czytania";
cout<<"\n\n";

return 0;
}
while (mojplik.good())
{
getline(mojplik, tekst);

if(pos != string::npos) {
for(;;pos += ciag.length()) {
pos = tekst.find(ciag,pos);

if(pos != std::string::npos) {
ile_c++;
} else {
break;
} } } } 
 mojplik.close();
cout << "W pliku: " <<dokument<<", jest  "<< ile_c << " cigow o wyrazach : '"<<ciag<<"'."<<endl;


    std::cin.get();
    std::cin.get();
}
0

Dla wejscia: "aaaaaa" i szukanego ciagu: "aa" zwroci wam 3
Jesli intencja zadania jest zwrocic 5 (czyli rowniez nakladajace sie wystapienia) to trzeba uzyc czegos innego.
Proponuje uzyc automatow skonczonych, albo algorytmow wyszukiwania wzorca.

0

Dla wejscia: "aaaaaa" i szukanego ciagu: "aa" zwroci wam 3
Jesli intencja zadania jest zwrocic 5 (czyli rowniez nakladajace sie wystapienia) to trzeba uzyc czegos innego.
Proponuje uzyc automatow skonczonych, albo algorytmow wyszukiwania wzorca.

To w moim kodzie zamieniamy pos + what.size() na pos + 1, w kodzie robcia podobnie.

Automaty skończone i algorytmy to pewnie overkill dla autora (chociaż byłoby szybciej).

0
msm napisał(a):

Dla wejscia: "aaaaaa" i szukanego ciagu: "aa" zwroci wam 3
Jesli intencja zadania jest zwrocic 5 (czyli rowniez nakladajace sie wystapienia) to trzeba uzyc czegos innego.
Proponuje uzyc automatow skonczonych, albo algorytmow wyszukiwania wzorca.

To w moim kodzie zamieniamy pos + what.size() na pos + 1, w kodzie robcia podobnie.

Automaty skończone i algorytmy to pewnie overkill dla autora (chociaż byłoby szybciej).

też mi się tak wydaje tym bardziej, że autor to jeszcze amator

To mógłby ktoś napisać jak przerobić to, żeby w następnych linijkach również wyszukiwało

0

Jak nie rozumiesz działania kodu to pytaj o to czego konkretnie nie rozumiesz. Twoja przeróbka tak właśnie ma. Sformatuj to po ludzku to sam zobaczysz gdzie popełniłeś błąd.

1

Poza formatowaniem przekombinowałeś, działający (przynajmniej jak u mnie) kod wygląda tak

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
int ile_c=0;
size_t pos = 0;
char dokument[255];
string tekst;
string ciag;
cout <<"podaj nazwe pliku tekstowego z ktorego ma byc wczytany tekst: "; cin>>dokument;

cout <<"jaki ciag znakow ma byc szukany: "; cin>>ciag;
ifstream mojplik(dokument);
if (!mojplik)
{
cout << "Nie mozna otworzyc pliku do czytania";
cout<<"\n\n";

return 0;
}
while (!mojplik.eof())
{

    getline(mojplik, tekst);
    size_t found;
    found=tekst.find(ciag);
    while (found!=string::npos)
        {
            ile_c++;

            found=tekst.find(ciag,found+1);
        }

}
 mojplik.close();
cout << "W pliku: " <<dokument<<", jest  "<< ile_c << " cigow o wyrazach : '"<<ciag<<"'."<<endl;


    std::cin.get();
    std::cin.get();
}

 

większość pętli while (!mojplik.eof()) zrobiłem na potrzeby spoj-owego zadania, wiec powinno być dobrze.

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