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 :) |
|
alixir |
» 2014-01-10 11:43:26 for( int i = 0; i < t; i++ ) { if( wiersz == '/' && wiersz[ i + 1 ] == '/' ) { for( int i = 0; i < t; ++i )
Dwukrotnie używasz zmiennej 'i' |
|
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 |
|
alixir |
» 2014-01-10 12:52:45 Przeanalizuj. O takie coś ci chodziło? while( !pr.eof() ) { std::getline( pr, wiersz ); t = wiersz.length(); for( int i = 0; i < t - 1; i++ ) { size_t poz = wiersz.find( "//" ); if( poz != std::string::npos ) { wiersz.erase( poz, t - poz ); break; } poz = wiersz.find( "/*" ); if( poz != std::string::npos ) { wiersz.erase( poz, t - poz ); komentarz = true; } poz = wiersz.find( "*/" ); if( poz != std::string::npos ) { wiersz.erase( 0, poz + 2 ); komentarz = false; } if( komentarz ) wiersz = ""; } std::cout << wiersz << std::endl; }
|
|
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 |
|
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.
|
|
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 |
|
alixir |
» 2014-01-10 13:20:04 Sprawdź całość #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() ) { std::getline( pr, wiersz ); t = wiersz.length(); for( int i = 0; i < t - 1; i++ ) { size_t poz = wiersz.find( "//" ); if( poz != std::string::npos ) { wiersz.erase( poz, t - poz ); continue; } poz = wiersz.find( "/*" ); if( poz != std::string::npos ) { wiersz.erase( poz, t - poz ); komentarz = true; } poz = wiersz.find( "*/" ); if( poz != std::string::npos ) { wiersz.erase( 0, poz + 2 ); komentarz = false; } 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; |
|
« 1 » 2 |