Zadanie domowe Poziom 3 Lekcja 28
Ostatnio zmodyfikowano 2013-04-08 21:05
sibi00 Temat założony przez niniejszego użytkownika |
Zadanie domowe Poziom 3 Lekcja 28 » 2013-04-06 09:52:27 Mam pewien problem z odczytem z tablicy. Poniżej wklejam swój kod.
#include "stdafx.h" #include <iostream> #include <string>
std::string konwertuj( std::string & sTekst ) { int tmp; int tmp1; std::string sWynik; sWynik.insert( 0, sTekst ); int pozycjespacji[ 40 ]; size_t spacje = sTekst.find( " " ); std::cout << spacje << " "; pozycjespacji[ 0 ] = spacje; std::cout << pozycjespacji[ 0 ]; do { int i = 1; spacje = sTekst.find( " ", spacje + 1 ); std::cout << spacje << " "; pozycjespacji[ i ] = spacje; std::cout << pozycjespacji[ i ] << " " << std::endl; } while( spacje != std::string::npos ); std::cout << std::endl; for( int j = 0; j < sizeof( pozycjespacji ) / sizeof( int ); j++ ) { int kolejny = j + 1; tmp = pozycjespacji[ kolejny ]; tmp1 = pozycjespacji[ j ] + 1; if( tmp1 == tmp ) { sWynik.erase( tmp1, 1 ); for( int g = j; g < sizeof( pozycjespacji ) / sizeof( int ); g++ ) { pozycjespacji[ g ] = pozycjespacji[ g ] - 1; } } else { }; } return sWynik; } int main() { int stop; std::string tekst = "<b>to jest </b> testowy napis :)"; std::cout << konwertuj( tekst ) << std::endl; std::cin >> stop; return 0; }
Przy usuwaniu spacji z ciagu znakow. Chcę to zrobić w taki sposób, że zczytałem pozycje spacji w ciągu znakow i zapisalem te pozycje do tablicy. Nastepnie w petli chcialem usuwac po jednym znaku z ciagu w przypadku gdy element tablicy jest o 1 wiekszy od poprzedniego oraz pozostalem elementy tablicy z wpolrzednymi spacjami zmniejszac o 1 ( usuwam znak to ciag robi sie o 1 element krotszy). Problem polega na tym, że w debugowaniu jak wchodze do funkcji to pokazuje mi jakies dziwne wartosci znajdujace sie w tablicy. W pierwszym obiegu petli w funkcji jak wpisuje do zmiennej tmp wartosc tablicy o spolrzednej j+1 to znajduje sie tam wartosc nie wiem dlaczego -1. |
|
Monika90 |
» 2013-04-06 10:16:38 Twoja pierwsza pętla zapisuje pozycje spacji do komórki pozycjespacji[1], jak już nie ma wiecej spacji, to find zwraca std::string::npos, które też jest zapisywane do pozycjespacji[1], npos konwertowane na int przyjmuje wartość -1. Czyli pozycjespacji[1] zawiera wartośc -1, pozostałe komórki tablicy zawierają śmieci. Napisz ten program jeszcze raz. |
|
sibi00 Temat założony przez niniejszego użytkownika |
» 2013-04-08 18:50:25
#include "stdafx.h" #include <iostream> #include <string>
std::string konwertuj( std::string & sTekst ) { std::string sWynik; sWynik.insert( 0, sTekst ); size_t spacjel = sWynik.find( " " ); size_t spacjep = sWynik.find( " ", spacjel + 1 ); std::string spacja = " "; do { if( spacjel == std::string::npos && spacjep == std::string::npos ) { return sWynik; } if( spacjel + 1 == spacjep ) { sWynik.erase( spacjel, 1 ); } spacjel = spacjep; spacjep = sWynik.find( spacja, spacjep + 1 ); } while( spacjel != std::string::npos && spacjep != std::string::npos ); std::string b = "<b>"; std::string nowe_b = "[b]"; size_t pozycjab = sWynik.find( b ); do { if( pozycjab == std::string::npos ) { return sWynik; } sWynik.erase( pozycjab, b.size() ); sWynik.insert( pozycjab, nowe_b ); pozycjab = sWynik.find( b, pozycjab + 1 ); } while( pozycjab != std::string::npos ); std::string c = "</b>"; std::string nowe_c = "[/b]"; size_t pozycjac = sWynik.find( c ); do { if( pozycjac == std::string::npos ) { return sWynik; } sWynik.erase( pozycjac, c.size() ); sWynik.insert( pozycjac, nowe_c ); pozycjac = sWynik.find( c, pozycjac + 1 ); } while( pozycjac != std::string::npos ); return sWynik; } int main() { int stop; std::string tekst = "<b>to jest </b> testowy napis <b> </b> :)"; std::cout << konwertuj( tekst ) << std::endl; std::cout << tekst; std::cin >> stop; return 0; }
Ponownie problem pojawił się w kasowaniu nadmiarowych spacji. Postanowilem nie robic dodatkowej tablicy tylko pojechac po kolei po spacjach. spacjel to pierwsza spacja natomiast spacjap to kolejna. Mialo to dzialac na zasadzie przeskokow przedzialu. Po pierwsze nie kasuje wszystkich spacji, a pod drugie debugujac pierwsza petle wchodzi w jakies pliki xstring, xutility. Może ktoś coś podpowie co robię źle? Odrazu możecie spojrzeć czy pozostała część zadania została dobrze wykonana. |
|
sibi00 Temat założony przez niniejszego użytkownika |
» 2013-04-08 21:05:46 bump. czekam na jakies wskazowki. Każdy pomysl bedzie bardzo pomocny.
[edit] Poprostu nie pomyślałem o tym, że można wykrywać 2 spacji obok siebie jakos ciag znakow i usuwac 1 znak. Poradzilem sobie przy pomocy rozwiazan zamieszczonych na forum ;) |
|
« 1 » |