Program nie pozwala wpisać danych

0
#include <iostream>

using namespace std;
void wprowadz(char*);
int dlugosc(char*);
char* znak(char* tab, char znaki);
void spacja(char* tab);
void wypisz(char* tab);
void zamiana(char* tab);
void odw_zamiana(char* tab);
bool palindrom(char* tab, int w);
int main()
{
    char tekst[140] = { 0 };
    char tekst2[80] = { 0 };
    char palin[120] = { 0 };
    char t;
    cout << "Wpisz tekst : " << '\n';
    cin.getline(tekst, 140);
    cout << "dlugosc tekstu wynosi : " << dlugosc(tekst) << '\n';
    cout << "Podaj jakiego znaku chcesz szukac : " << '\n';
    cin >> t; // tu sie po naciśnięcia enter program omija następne wpisywanie tekstu
    char* B = znak(tekst, t);
    if (znak(tekst, t) == NULL)
    {
        cout << "Nie znaleziono litery" << '\n';
    }
    else
        cout << "Wskaznik szukanej litery : " << *B << '\n';
    spacja(tekst);
    cout << "Tekst po usunieciu spacji : " << '\n';
    wypisz(tekst);
    cout << '\n';
    cout << "Prosze podac tekst w ktorym male litery zostana zastopione wielkimi :" << '\n';
    cin.getline(tekst2, 80);
    cout << "Tekst przed zamiana : " << '\n';
    wypisz(tekst2);
    cout << '\n';
    cout << "Tekst po zamianie : " << '\n';
    zamiana(tekst2);
    wypisz(tekst2);
    cout << '\n';
    cout << "Podaj tekst, ktory zostanie sprawdzony czy jest palimdromem : " << '\n';
    cin.getline(palin, 120);
    if (palindrom(palin, dlugosc(palin)) == true)
        cout << "Tekst jest palimdromem.";
    else
    {
        cout << "Tekst nie jest palimdromem.";
    }


    return 0;
}

int dlugosc(char* t)
{
    int licznik = 0;
    int i = 0;
    while (t[i] != NULL)
    {
        licznik++;
        i++;
    }
    return licznik;
}

char* znak(char* tab, char znaki)
{
    int i = 0;
    while (tab[i] != NULL)
    {
        if (tab[i] == znaki)
        {
            return &tab[i];
        }
        else
            i++;
    }
    return NULL;
}

void spacja(char* tab)
{
    int i = 0;
    int j;
    while (tab[i] != NULL)
    {
        if (tab[i] == ' ')
        {
            j = 0;
            j = i;
            do
            {
                tab[j] = tab[j + 1];
                j++;

            } while (tab[j] != NULL);
        }
        else
            i++;
    }
}


void wypisz(char* tab)
{
    int i = 0;
    while (tab[i] != NULL)
    {
        cout << tab[i];
        i++;
    }
}

void zamiana(char* tab)
{
    int i = 0;
    while (tab[i] != NULL)
    {
        if ((int)tab[i] > 96 && (int)tab[i] < 123)
        {
            tab[i] = (char)(tab[i] - 32);
        }
        i++;
    }
}

bool palindrom(char* tab, int w)
{
    int n = w - 1;
    int i = 0;
    odw_zamiana(tab);
    while (i <= w / 2 && n >= w / 2)
    {
        if (tab[i] == ' ')
        {
            i++;
        }
        else if (tab[n] == ' ')
        {
            n--;
        }
        else if (tab[i] == tab[n])
        {
            i++;
            n--;
        }
        else if (tab[i] != tab[n])
            return false;
    }

    return true;
}
void odw_zamiana(char* tab)
{
    int i = 0;
    while (tab[i] != NULL)
    {
        if ((int)tab[i] > 64 && (int)tab[i] < 91)
        {
            tab[i] = (char)(tab[i] + 32);
        }
        i++;
    }
}

Wiem, gdzie jest błąd jednak nie wiem jak go rozwiązać ;/ ( komentarz w kodzie )
gdy wpisuje do pierwszej tablicy wszystko jest ok, nast. podaje znak, którego mam szukać, ale po podaniu tego znaku program omija mi następny etap :/
Czy ktoś jest w stanie mi pomóc ?

Dodam, ze nie mogę uzywać stringa i koniecznie ta funkcja musi zwracać wskaźnik, bo takie jest życzenie prowadzącej zajęcia ;x

0

Drugie pytanie odnoścnie tego kodu :

else cout << "Wskaznik szukanej litery : " << *B << '\n' ;
Normalnie to mi wywołuje ten znak, który był szukany.
Jeżeli z tej linijki usunę ' * ' to zaczyna mi drukować od napotkanej litery, czemu ?

0

Bo znak * to operator dereferencji, więc dostajesz dokładnie taką wartość jaka kryje się pod wskaźnikiem.

char *B = znak(tekst, t);
    if ( znak(tekst, t) == NULL){ // dlaczego tutaj wywołujesz drugi raz funkcję 'if(NULL == B){}else{}'
        cout << "Nie znaleziono litery" << '\n';
    }
    else cout << "Wskaznik szukanej litery : " << *B << '\n' ; 

Natomiast operator strumienia << jest tak przeciążony, żeby drukować całe łańcuchy,
a cout << B; jest interpretowane jak początek łańcucha.

Dlaczego nie zwrócisz zwykłego chara, skoro to jest tylko jeden znak?

PS:

Wrzuć najmniejszy możliwy kod, który przedstawia problem. Mało komu będzie się chciało przez tę całość przebywać. - Patryk27 2016-12-04 20:57

else cout << "Wskaznik szukanej litery : " << *B << '\n' ; 

Trochę zbyt dosłownie to potraktowałeś.

0

Czy moglbys podac jakas strone, gdzie jest to dobrze objasnione to cale przeciazanie operatorow ? Bo niestety te strony, które ja znajduje wyjaśniają to na podstawie klas, których nie umiem.

0

Nie da się. Przeciążać operatory można tylko dla klas, te pojęcia są ze sobą nierozerwalnie związane.

0
kenik napisał(a):

Czy moglbys podac jakas strone, gdzie jest to dobrze objasnione to cale przeciazanie operatorow ? Bo niestety te strony, które ja znajduje wyjaśniają to na podstawie klas, których nie umiem.

http://en.cppreference.com/w/cpp/io/basic_ostream
std::cout jest obiektem klasy std::basic_ostream<> i ma przeciążony operator << dla standardowego wyjścia w taki sposób,
że dla tablic typów liczbowych użycie wskaźnika bez dereferencji wypisze adres komórki, na którą wskazuje wskaźnik.
Natomiast dla tablic znakowych char wypisze łańcuch. Tak napisali ten operator i tyle.
To, że u ciebie jest zwrócony jeden znak dla kompilatora nie ma znaczenia.
Kompilator nie będzie sprawdzał ile jest znaków w tablicy, tylko rozpocznie od pierwszego znaku i będzie czytał
do napotkania znaku zerowego '\0'.

#include <iostream>

int main()
{
    int arr[3]{ 1,2,3 };
    char word[]{ "john" };
    std::cout << arr << " " << *arr << '\n'; // arr - adres, *arr - wartość pierwszego elementu
    std::cout << word << " " << *word << '\n'; // word - wypisze łańcuch, *word - wypisze pierwszy znak
} 

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