Wyszukiwanie komentarzy

0

Witam, mam do napisania program, który bedzie wyszukiwał komentarze w pliku, który jest jakimś kodem w c++ i następnie je wypisywał.

Mój pomysł, na ten program, wygląda tak:

 
void znajdz(string plik, char znak1, char znak2, char znak3){
	cin >> plik;

    if(plik.find(znak1) != string::npos){
    	//sprawdzic, czy poprzedni znak to " jesli nie - zapisac caly tekst do /n do stringa, jesli tak to przejdz do nast linii
    }
	if(plik.find(znak2) != string::npos){}
		//sprawdzic, czy poprzedni znak to " jesli nie - zapisac caly tekst do char3 do stringa, jesli tak to przejdz do nast linii

}

gdzie char1 - //, char2- /*, char3 - */.
Mój problem, to jak sprawdzać ten poprzedni znak? Musze go sprawdzic, zeby nie było sytuacji, ze np. mam w sprawdzanym pliku

  (...) cout << "//teksttekst"; 
1

Bezpośrednia odpowiedź na twoje pytanie:

for(int prev=0,ch;(ch=plik.get())!=EOF;prev=ch)
  {
  }

Ale najlepiej zastosuj automat deterministyczny.

0

a jakoś w miarę prosty sposób? to ma byc bardzo prosto napisane, poniewaz ucze sie tego zaledwie od 3 miesiecy

1

Automat deterministyczny jest najprostszym sposobem, jedynie trzeba rysuneczek sobie zrobić.

0

a można liczyc to w jakiś sposób za pomocą bitów? ponieważ nie bardzo mogę wykorzystać cos, co nie zostało omówione na wykładach

0

Co to znaczy liczyć za pomocą bitów?

0
goal napisał(a):

nie bardzo mogę wykorzystać cos, co nie zostało omówione na wykładach

Przecież to bez sensu. Na jakiej jesteś uczelni? Będę wiedział której nie polecać.

Co do problemu, myślałeś nad wyrażeniami regularnymi? Tu nawet jest pokazane krok po kroku jak jest budowane http://blog.ostermiller.org/find-comment Nie wiem czy jest tam sprawdzany przypadek gdy "komentarz" jest w napisie, ale pewnie dodać to nie problem.

0

Np. sprawdzać, który z kolei wyszukany znak to //, a pozniej czy poprzedni to "

0

uzyc regexa ;) Niestety jeszcze ekspertem w tym nie jestem... takze moja propozycja to musialbys zrobic dwa regexy (na pewno mozna to zrobic w jednym...)

pierwszy to takie cos
\/\/.*
z flaga globalna (/g)
https://regex101.com/r/uH0eW3/1

drugie to takie cos
\/\*.*\*\/
z flaga /s
https://regex101.com/r/iD2gL1/1

2
goal napisał(a):

a jakoś w miarę prosty sposób? to ma byc bardzo prosto napisane, poniewaz ucze sie tego zaledwie od 3 miesiecy

fasadin napisał(a):

przy takich zalozeniach ciezko bedzie napisac cos w miare prostego ( i szybkiego) co dziala ;)

Masz coś bardzo prostego i bardzo szybkiego:

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

struct { int v,s,n; } tb[]=
  {
    { 34,  0,  1 },    { 92,  1,  2 },    { 34,  1,  0 },    { 39,  0,  3 },
    { 92,  3,  4 },    { 39,  3,  0 },    { 47,  0,  5 },    { 47,  5, -1 },
    { 10, -1,  0 },    { 42,  5, -2 },    { 42, -2,  6 },    { 47,  6,  0 },
    { -1,  2,  1 },    { -1,  4,  3 },    { -1,  6,  0 },    { -1,  5,  0 },
  };

int main()
  {
   ifstream fin("comdet.cpp");  // ala ma kota
   for(int s=0,p=0,v;(v=fin.get())!=EOF;p=s) /* ewa ma psa */
     {
      for(const auto &i:tb) if((i.s==s)&&((i.v<0)||(i.v==v))) { s=i.n; break; }
      if(p<0) cout<<(char)(s<0?v:'\n');
     }
   return 0;
  }

Uwaga, trochę obfuskowane aby nie dawać gotowca.

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