Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Usuwanie komentarzy

Ostatnio zmodyfikowano 2014-01-10 15:42
Autor Wiadomość
patoxd
Temat założony przez niniejszego użytkownika
[C++] Usuwanie komentarzy
» 2014-01-10 11:38:45
Mam taki problem problem. Nie wiem jak zapisac zeby program poprawnie usuwal komentarz. Mam coś takiego :

bool komentarz=0;
    int t;
   
    while (!pr.eof())    //czytanie do momentu osiagniecia konca pliku
    {
          getline(pr,wiersz);
          t = wiersz.length();
          for(int i=0; i<t; i++)
          {
                  if(wiersz=='/' && wiersz[i+1]=='/')
          {
                  for(int i=0; i<t; ++i)
                  {
                          wiersz=znak;
                  }
          }
                         
            
   
          for(int j=0; j<t; j++)    
          { 
                if(wiersz[j]=='/' && wiersz[j+1]=='*')
          {
komentarz=1;
++j;
          }
         if(wiersz[j]=='*' && wiersz[j+1]=='/')
                 komentarz=0;
         if(komentarz==1)
                 wiersz[j]=znak;    
         }

         }

Problem polega na tym, ze z zapisu /* */ dobrze usuwa, a z // źle, bo zabiera też symbol //

Pomożecie ? Byłbym bardzo wdzięczny :)
P-101739
alixir
» 2014-01-10 11:43:26
C/C++
for( int i = 0; i < t; i++ )
{
    if( wiersz == '/' && wiersz[ i + 1 ] == '/' )
    {
        for( int i = 0; i < t; ++i )

Dwukrotnie używasz zmiennej 'i'
P-101740
patoxd
Temat założony przez niniejszego użytkownika
» 2014-01-10 11:45:32
Ale jak zmieniam ją np. na k, to program działa jeszcze gorzej, wtedy już jest calkowicie źle
P-101741
alixir
» 2014-01-10 12:52:45
Przeanalizuj. O takie coś ci chodziło?

C/C++
while( !pr.eof() ) { //czytanie do momentu osiagniecia konca pliku
    std::getline( pr, wiersz );
    t = wiersz.length();
    for( int i = 0; i < t - 1; i++ ) {
       
        // testujemy czy w lini pojawia sie znak //
        size_t poz = wiersz.find( "//" );
        if( poz != std::string::npos ) {
            wiersz.erase( poz, t - poz );
            break; // pomijamy reszte warunkow
        }
       
        // testujemy czy w lini pojawia sie znak /*
        poz = wiersz.find( "/*" );
        if( poz != std::string::npos ) {
            wiersz.erase( poz, t - poz );
            komentarz = true;
        }
       
        // testujemy czy w lini pojawia sie znak */
        poz = wiersz.find( "*/" );
        if( poz != std::string::npos ) {
            wiersz.erase( 0, poz + 2 );
            komentarz = false;
        }
       
        // dodatkowo jesli cala linia powinna byc zakomentowana - czyscimy ja
        if( komentarz )
             wiersz = "";
       
    }
   
    std::cout << wiersz << std::endl;
}
P-101744
patoxd
Temat założony przez niniejszego użytkownika
» 2014-01-10 12:59:47
Dzięki, tylko działa to w ten sposób, że zamienia wszystkie znaki kodu na np. *, a nie tylko komentarze
P-101745
alixir
» 2014-01-10 13:03:54
Nie bardzo rozumiem.
Poza komentarzami nie ma prawa dziać się coś z resztą kodu.
Pętla szuka ciągów znaków:
- //
- /*
- */
i żaden inny niepasujący ciąg nie może zostać zakwalifikowany jako komentarz.
P-101746
patoxd
Temat założony przez niniejszego użytkownika
» 2014-01-10 13:11:52
Może to być wina kompilatora ? Używam DevCpp 4.9.9.2
P-101749
alixir
» 2014-01-10 13:20:04
Sprawdź całość

C/C++
#include <fstream>
#include <iostream>
#include <string>
#include <limits>

int main() {
   
    std::ifstream pr;
   
    pr.open( "test.txt" );
   
    if( !pr.good() )
         return 1;
   
    int t;
    std::string wiersz;
    bool komentarz = false;
   
   
    while( !pr.eof() ) { //czytanie do momentu osiagniecia konca pliku
        std::getline( pr, wiersz );
        t = wiersz.length();
        for( int i = 0; i < t - 1; i++ ) {
           
            // testujemy czy w lini pojawia sie znak //
            size_t poz = wiersz.find( "//" );
            if( poz != std::string::npos ) {
                wiersz.erase( poz, t - poz );
                continue; // pomijamy reszte warunkow
            }
           
            // testujemy czy w lini pojawia sie znak /*
            poz = wiersz.find( "/*" );
            if( poz != std::string::npos ) {
                wiersz.erase( poz, t - poz );
                komentarz = true;
            }
           
            // testujemy czy w lini pojawia sie znak */
            poz = wiersz.find( "*/" );
            if( poz != std::string::npos ) {
                wiersz.erase( 0, poz + 2 );
                komentarz = false;
            }
           
            // dodatkowo jesli cala linia powinna byc zakomentowana - czyscimy ja
            if( komentarz )
                 wiersz = "";
           
        }
       
        std::cout << wiersz << std::endl;
    }
   
    pr.close();
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
    return 0;
}

Plik testowy:

Linia 1 - napis1
Linia 2 - // napis2
Linia 3 - napis3
/* Linia 4 - napis4
Linia 5 - napis5
Linia 6*/ - napis6
//Linia 7 - napis7

int * wsk;
// komentarz
int a, b, c;
a=b/c*10;
P-101750
« 1 » 2
  Strona 1 z 2 Następna strona