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

Modyfikowanie tekstu (2 problemy)

Ostatnio zmodyfikowano 2015-05-14 17:05
Autor Wiadomość
Huxyf
Temat założony przez niniejszego użytkownika
Modyfikowanie tekstu (2 problemy)
» 2015-05-12 22:34:10
Witam,
Mam 2 problemy z poniższym kodem.
1. Nie wiem z jakiego powodu ale getline'y w funkcjach nie działają
2. Pierwsza funkcja nie chce działać, prawdopodobnie w tym if'ie z komentarzem coś nie gra.

Proszę o pilną pomoc.

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

using namespace std;

void Wyswieltekst( string tekst, int dlugosc )
{
    int wiersz = 15;
    bool number = false;
   
    cout << endl << "INDEKSY ZNAKOW: " << endl << endl;
   
    for( int x = 1; x <= dlugosc; )
    {
        cout << "x wynosi: " << x << endl;
        cout << "dlugosc - x: " << dlugosc - x << endl;
        cout << "dlugosc: " << dlugosc << endl;
       
        // Ten if chyba jest zly
        if(( dlugosc - x ) < wiersz )
        {
            wiersz =( dlugosc - x );
        }
       
        for( int y = 0; y < wiersz; y++ )
        {
            if( number == false )
            {
                cout << "[" << tekst[ y + x ] << "]";
                if(( y + x ) > 99 )
                {
                    cout << "  ";
                }
                else if(( y + x ) > 9 )
                {
                    cout << " ";
                }
            }
            if(( y ==( wiersz - 1 ) ) &&( number == false ) )
            {
                number = true;
                cout << endl;
                y = 0;
            }
            if( number == true )
            {
                cout << "[" << y + x << "]";
            }
        }
        cout << endl << endl;
        number = false;
        x += wiersz;
    }
}

int Wybierz_opcje()
{
    int znak;
    bool blad;
    cout << endl << "Modyfikacje tekstu" << endl;
    cout << "[1] Dopisz do konca" << endl;
    cout << "[2] Dopisz w dowolnym miejscu" << endl;
    cout << "[3] Usun fragment" << endl << endl;
    cout << "Wybierz modyfikacje: ";
    for(;; )
    {
        cin.clear();
        cin.sync();
        cin >> znak;
        blad = cin.fail();
        if(( blad == false ) &&( znak > 0 ) &&( znak < 4 ) )
        {
            return znak;
        }
        cout << endl << "Nieprawidlowa modyfikacja! ";
        cout << "Wybierz ponownie modyfikacje: ";
    }
}

int Podaj_indeks( int dlugosc )
{
    int id;
    bool blad = false;
   
    do
    {
        cin.clear();
        cin.sync();
        cin >> id;
        blad = cin.fail();
        if(( blad == true ) ||( id < 1 ) ||( id > dlugosc ) )
        {
            cout << endl << "Nieprawidlowy indeks! ";
            cout << "Podaj ponownie numer indeksu: ";
        }
    } while(( blad == true ) ||( id < 1 ) ||( id > dlugosc ) );
   
    return id;
}

void Dopisz( string & tekst )
{
    string napis = "";
    cout << "Wpisz tekst, ktory chcesz dopisac: ";
    getline( cin, napis );
    tekst += napis;
}

void Dopisz_w( string & tekst, int dlugosc )
{
    int id;
    string napis = "";
    cout << "Wpisz tekst: ";
    getline( cin, napis );
    cout << "Podaj numer indeksu przed, ktorym chcesz dopisac \"" << napis << "\": ";
    id = Podaj_indeks( dlugosc );
    tekst.insert(( id - 1 ), napis );
}

void Usun( string & tekst, int dlugosc )
{
    int id_pocz, id_konc, pomocniczy;
    cout << "Podaj numer indeksu od, ktorego chcesz rozpoczac usuwanie: ";
    id_pocz = Podaj_indeks( dlugosc ) - 1;
    cout << "Podaj numer indeksu na, ktorym chcesz poprzestac usuwanie: ";
    pomocniczy = Podaj_indeks( dlugosc ) - 1;
    id_konc = pomocniczy - id_pocz;
    tekst.erase( id_pocz,( id_konc + 1 ) );
}

int main()
{
    string ciag = "";
    int dlugosc, opcja;
   
    cout << "Wprowdz tekst: ";
    getline( cin, ciag );
    dlugosc = ciag.size();
   
    opcja = Wybierz_opcje();
   
    switch( opcja )
    {
    case 1:
        {
            Dopisz( ciag );
            break;
        }
    case 2:
        {
            Wyswieltekst( ciag, dlugosc );
            Dopisz_w( ciag, dlugosc );
            break;
        }
    case 3:
        {
            Wyswieltekst( ciag, dlugosc );
            Usun( ciag, dlugosc );
            break;
        }
    }
    cout << ciag;
    return 0;
}
P-132155
pekfos
» 2015-05-12 22:48:18
Pewnie przez mieszanie >> z getline(), te dwie metody mają trochę odmienne polityki wobec znaków kończących wczytywanie. Próbuj dopisać cin.sync() przed wywołania getline().
P-132160
Monika90
» 2015-05-12 22:49:11
po każdym
cin >> zmienna;
 daj
cin.ignore();
 albo lepiej
cin.ignore( numeric_limits < streamsize >::max(), '\n' );
P-132162
Huxyf
Temat założony przez niniejszego użytkownika
» 2015-05-12 23:13:37
pekfos - Wielkie dzięki! cin.sync() przed getline'ami naprawił problem (1).

Proszę o pomoc przy if'ie.
P-132166
pekfos
» 2015-05-12 23:20:01
2. Pierwsza funkcja nie chce działać
A jak ma działać?
P-132168
Huxyf
Temat założony przez niniejszego użytkownika
» 2015-05-13 09:04:30
Funkcja ma wyświetlać listę znaków, które wprowadził użytkownik oraz nr. indeksu pod każdym znakiem. Ten if miał za zadanie sprawdzić czy długość ciągu - x to co się wyświetliło (czyli ilość pozostałych znaków) jest mniejsza od ilości znaków w wierszu, które są domyślnie ustawione na 15. Jeżeli tak ilości znaków w wierszu przypisz ilość pozostałych znaków.
P-132171
Huxyf
Temat założony przez niniejszego użytkownika
» 2015-05-14 17:05:24
Błąd zlokalizowany. Funkcja nie działała poprawnie z powodu
x = 1
.

Temat uważam za rozwiązany w związku z tym zamykam wątek.
P-132242
« 1 »
  Strona 1 z 1