Modyfikacja stringa (toupper)

0

Bawię się zadaniem ze spoja (http://pl.spoj.com/problems/JHTMLLET/). Napisałem sobie prosty programik, który wyszukuje mi tagi otwarcia znacznika ('<') oraz zamknięcia ('>'), w pętli zmieniam wielkość znaków w znacznikach, ale moja skromna wiedza nie pozwala mi na stałą zmianę wczytywanego tekstu. Mogę wypisać wskaźniki ze zmianą na duże litery, ale

toupper(tekst[i], loc); 

nie zmienia mi tych fragmentów w samym tekście wejściowym. Poniżej kod:

 
#include <iostream>
#include <string>
#include <locale>

using namespace std;

char open = '<';
char close = '>';

int main() {
    string tekst = "<html>\n<head>\n<TITLE>To jest tytul</Title>\n</head>\
    \n<body>\n<b>Cos tam</b>\n</body>\n</html>";
    locale loc;
    size_t poz_open = tekst.find(open);
    size_t poz_close = tekst.find(close);
    do {
        cout << "Open: "<< poz_open<<" "<<endl;
        cout << "CLose: "<< poz_close<<" "<<endl;
        for (int i = poz_open +1; i < poz_close; i++) {
            toupper(tekst[i], loc);
            cout << toupper(tekst[i], loc);
        }
        cout << endl;
        poz_open = tekst.find(open, poz_open + 1);
        poz_close = tekst.find(close, poz_close +1);

    }while(poz_close != string::npos && poz_open != string::npos);
    cout << tekst;
    return 0;
}

Jak sprawić żeby końcowe

 cout<<tekst 

wypisało tekst ze zmienioną wielkością liter w tagach? Dzięki za pomoc.

3
str[i] = toupper(str[i]);

Poza tym, po co używasz wersji z <locale> zamiast z <cctype>?

Przy okazji, istotna lektura: http://4programmers.net/C/Przekazywanie_parametru_przez_warto%C5%9B%C4%87_i_referencj%C4%99

0

str[i] = toupper(str[i]);

Dzięki - oczywiście działa tak jak powinno;)

Poza tym, po co używasz wersji z <locale> zamiast z <cctype>?

Szukałem w necie odpowiedniej funkcji i po prostu natrafiłem na wersję z <locale>, która w zasadzie niewiele się różni od tej z <cctype>? Kiedy powinno się używać pierwszej, a kiedy drugiej?

1

locale jest bardziej "zaawansowana", w przypadku jak operujesz w zakresie ASCII (tak jak w tym zadaniu i znakomitej większości przypadków) to nie ma co się męczyć.

0

To teraz pytanie wykraczające lekko poza zadanie, które udało mi się rozwiązać (spoj zaakceptował mój kod). Poniżej moje wypociny:

 
#include <iostream>
#include <string>
#include <ctype.h>

using namespace std;

char open = '<';
char close = '>';

int main() {
    // string tekst = "<html>\n<head>\n<TITLE>To jest tytul</Title>\n</head>\
    // \n<body>\n<b>Cos t<am</b>\n</body>\n</html>";
    string tekst;
    while(getline(cin,tekst))
    {
    size_t poz_open = tekst.find(open);
    size_t poz_close = tekst.find(close);
    do {
        for (int i = poz_open +1; i < poz_close; i++) {
            tekst[i] = toupper(tekst[i]);
        }
        poz_open = tekst.find(open, poz_open + 1);
        poz_close = tekst.find(close, poz_close +1);

    }while(poz_close != string::npos && poz_open != string::npos);
    cout << tekst <<endl;}
    return 0;
}

Zauważyłem jednak, że program nie jest w stanie w takiej formie poprawnie rozróżniać znaczników początku ('<') i końca ('>'). Jak dajmy na to tekst wczytywany będzie wyglądał "

To jest jakis tekst

wszystko będzie ok - program zamieni znaczniki na <P> i </P> zostawiając wszystko pomiędzy niezmienione. Jak natomiast do samego tekstu wkradnie się znacznik np.

To jest jakis te<kst

to wyjście będzie wyglądało tak <P>To jest jakis te<KS</P> czyli nie tak jak ma być. W jaki sposób zmusić powyższy program żeby właściwie rozróżniał znaczniki/tekst między znacznikami. Jest to w ogóle możliwe w miarę prosty sposób (tak żeby niezawodowy programista to zrozumiał)?</p>
1

Nie jest to proste, dlatego w html masz np. > i <

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