Program zliczający linijki kodu bez komentarzy

0

Witam

Mam do napisania prosty programik zliczający linijki kodu oczywiście bez pustych linii. Zadanie banalne ale jeśli chciałbym by ten program nie zliczał komentarzy jednoliniowych oraz wieloliniowych to rozwiązanie staje się już trudniejsze.

Załóżmy sytuację pierwszą:

        cos tam
        //komentarz
        ciag dalszy

Tu chciałbym by linijkę która zaczyna się od // w ogóle pominąć przy zliczaniu

Sytuacja druga:

        /*
        komentarz
        komentarz
        komentarz
        */

Oczywiście tu także chciałbym pominąć komentarz. Czyli jeśli znajdę w linijce /* to ustawiam flagę komentarz na true. Niby proste ale co zrobić jeśli miałbym sytuację trzecią:

        cos tam //tu komentarz prosty
        cos tam 2/* pierwsza linia komentarza
                         druga linijka komentarza*/

jak rozwiązać taka sytuacje?

0
  1. Usuń komentarze
  2. Policz linie które pozostały
    ?
0

W trzecim przypadku chodziło o to, że przed komentarzem wieloliniowym jest jakiś tekst.
Ok czyli muszę zmienić całkowicie swój program gdyż do tej pory wczytywałem po linijce z pliku i na każdej linijce przeprowadzam działania.

Jak najłatwiej kasować ciągi znając miejsce rozpoczęcia komentarza oraz jego zakończenia? czy po prostu nadpisywać ze spacją czy może ze znakiem backspace?
Czy funkcja stringa erase(od,do) jest najlepszym rozwiązaniem?

0

Chyba jeszcze inaczej.

int a=23;/*zaczynamy komentarz
kontynuujemy
kończymy komentarz*/int b=45;

W tym przykładzie, zamiast komentarza trzeba wstawić jeden znak nowego wiersza.

0

Zrobiłem funkcję która wyszukuję dany ciąg znaków i zwraca jego położenie.

  1. Jeśli natrafisz na /* to zapamiętaj jego położenie. wywołaj funkcje szukającą */ i zapamiętaj jego położenie.
  2. Wywołaj erase z parametrami od /* do */.
    i tak w kółko.

Co myślicie o takim łopatologicznym przykładzie?

0
std::string qqq = "qwe/*asd";
...
kod
...
qqq = "*/";
0

Mam taką funkcję szukającą:

 
double szukaj( string & tekst, string szukanyZnak )
{
    size_t znalezionaPozycja = tekst.find( szukanyZnak );
    if( znalezionaPozycja == string::npos )
        return -1;//Nie znaleziono znaku w tekscie
    else
        return znalezionaPozycja;//Zwraca pozycje gdy zostal odnaleziony znak 
    
}

oraz taką pętlę:

 
 while( szukaj(tekst,"/*")>-1 )
      {
           double a=szukaj(tekst,"/*");
           double b=szukaj(tekst,"*/")+2;  
           tekst.erase(a,b-a);
           // cout <<"start: "<<a<< " x "<< b<< endl;  
      }

Niestety gdy w zmiennej tekst występują dwa lub więcej komentarzy to od początku drugiego(!) komentarza znika zawartość aż do końca zmiennej tekst.
Działa wielkie dzięki za podsunięte rozwiązania.

Jak teraz policzyć ile linii zawiera string?

0
count(tekst.begin(), tekst.end(), '\n');
0

Nie chce się znęcać, ale jaki będzie wynik twojego programu dla takiego kodu: http://ideone.com/VJ2he . Jak widać kompiluje się, choć nawet kolorowanie składni wysiada, a nawet nie używałem trigraphów.

0

Może kompiluje się dlatego, że kompilator widzi, że komentarz jest nie zakończony i sam dodaje "*/" oraz zamyka blok main?

0

Mam jeszcze jedno pytanie.
Jak sprawdzi ile znaków zostało do końca linii?
np. znalazłem "//" na pozycji 13. jak teraz sprawdzić jak daleko znajduje się pozycja 13 od końca tej linii?

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