Wskaźniki na tablicach char

0

Ponownie witam wszystkich serdecznie :)
Tym razem pojawił się kłopot również w zadaniu z książki Szkoły Programowania Stephana Prata, a mianowicie....
Napisz program korzystający z tablicy char, odczytujący w pętli słowo po słowie, aż do wpisania gotowe. Następnie program powinien pokazywać liczbę podanych słów (poza gotowe). Przy porównaniach użyć funkcji strcmp() i pliku nagłówkowego cstring.

Generalnie zadanie rozwiązałem, ale po swojemu, a nie tak jak autor sobie życzył.
Oto kod :

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char tekst[256];
    char klucz[7]="gotowe";
    char *pt;
    char *ps;
    int a,b;
    pt = klucz;
    bool index = 1;
    int licznik = 0;

    cout << "Podaj slowa (kiedy skonczysz napisz \"gotowe\")" << endl;
    do
    {
        cin.get(tekst,256).get();
        ps = strtok(tekst," ,.-");
        while (ps != NULL)
        {
            a=*ps;
            b=*pt;
            ps = strtok(NULL, " ,.-");
            if(a==b) index = 0;
            if(index==1)licznik++;
        }
    } while (index != 0);
    cout << endl << "Ilosc wyrazow: " << licznik << endl;

    return 0;
}

Jak widać program działa, ale bez funkcji strcmp().

Oto kod z wymaganą w treści zadania funkcją, ale mi nie działa:

 

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char tekst[256];
    char klucz[7]="gotowe";
    char *ps;
    bool index = 1;
    int licznik = 0;

    cout << "Podaj slowa (kiedy skonczysz napisz \"gotowe\")" << endl;
    do
    {
        cin.get(tekst,256).get();
        ps = strtok(tekst," ,.-");
        while (ps != NULL)
        {
            cout << ps << " = " << klucz << endl;
            ps = strtok(NULL, " ,.-");
            index = strcmp(ps,klucz);        **W TEJ LINII PROGRAM MI SIĘ ZAWIESZA**
            if(index==1)licznik++;
        }
    } while (index != 0);
    cout << endl << "Ilosc wyrazow: " << licznik << endl;

    return 0;
}

Znajdzie się chętna osoba, do wyjaśnienia dlaczego strcmp() zawiesza mi program, jeśli wprowadzane są takie same wartości char? T

http://www.cplusplus.com/reference/cstring/strcmp/?kw=strcmp
W przykładzie na stronie również podano wartości char.

Pozdrawiam.

0
#include <string>
#include <iostream>
using namespace std;

int main () {
    string input;
    string termination_string = "gotowe";
    size_t count = 0;
    
    do {
        cin >> input;
        ++count;
    } while (input != termination_string);
    --count;
    
    cout << count;
}

Naprawdę taki kod mniej Ci się podoba? Albo taki?

#include <string>
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std;

int main () {
    string termination_string = "gotowe";
    cout << count_if(
        std::istream_iterator<string>(cin),
        std::istream_iterator<string>(),
        [&] (auto &&s) { return s != termination_string; });
}
0

Treść zadania jest aby to na tablicach char zrobić, a nie na stringach :( , więc zrobiłem na charach.

0

Chcesz sie uczyć C czy C++? A i tak powiedziałeś, że zrobiłeś po swojemu.

0

Chcę się uczyć C++, tylko chciałem wszystkie zadania dokładnie z treścią wykonać. Jeśli nie ma to jednak sensu, to będę robił aby działały i tyle ;) Sam fakt, że ciekawi mnie dlaczego mi ten strcmp() nie działa.

0

Dostajesz SIGSEGV bo ps == NULL przed zaznaczoną przez Ciebie linijką. Zauważ że nigdzie tego nie sprawdzasz.

ps = strtok(NULL, " ,.-");
// tu ps == NULL
index = strcmp(ps,klucz); // **W TEJ LINII PROGRAM MI SIĘ ZAWIESZA**

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