Akademicki program z użyciem wskaźników C/C++.

0

Napisz program, dzielący napis na wyrazy. Napis jest ciągiem występujących naprzemiennie separatorów i wyrazów. Separatory są ciągami składającymi się z jednego, lub więcej, znaków separujących. Wyrazy to ciągi wszystkich innych znaków.
Zasady

W zadaniu należy wykorzystać wskaźniki, dlatego jedynymi dozwolonymi typami danych są char oraz char * (oraz ich tablice). Użycie w kodzie nazw innych typów jest niedozwolone. Dodatkowo, nie można korzystać z pliku nagłówkowego "string.h" ani "string".
Wejście

Na wejście podana zostanie pewna liczba par. Pary składają się z napisu i, oddzielonej spacją, listy znaków separujących, po której następuje znak nowej linii. Zarówno napis, jak i lista znaków separujących składają się z samych czarnych znaków, a długość każdego z nich nie przekracza 10000 znaków.
Wyjście

Dla każdego testu, na wyjście należy wypisać ciąg kolejnych wyrazów z napisu, rozdzielając je spacjami. Każdy test należy zakończyć znakiem nowej linii.
Przykład

Wejście:
-1- -
-1- 1
ab-c-def -=
123abc456gfed789 abcdefghijklmnopqrstuvwxyz

Wyjście:
1

ab c def
123 456 789

Oto mój kod:

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
char wyraz[10000];
char separator [10000];
char *w1,*w2;
while (cin >> wyraz >> separator)
{
    for (w1=wyraz ; *w1!='\0' ; *w1++)
    {
        for(w2=separator; *w2!='\0'; w2++)
        {
        if (*w1!=*w2)
       {
          cout << *w1;
       }
       else
       {
          cout << " ";
       }
        }
    }
     cout << endl;
}
    system("PAUSE");
    return 0;
}
 

Ale tutaj mamy dwa mankamenty.
Pierwszy przemieszczanie się po drugim wyrazie ( separatorach) działa błędnie. Dla przykładu pierwszego i drugiego spoko, ale jak separatorów jest więcej niż jeden, to wypisuje głupoty.
Drugi, z przykładowego wyjścia z treści zadania wynika, że jeśli separator był pierwszym znakiem to ma zostać pominięty, w takim sensie że pierwszym znakiem nie może być spacja.
Mam świadomość, że to pewnie nie jest coś trudnego, ale straciłem już sporo czasu na tym, wstyd... Bardzo proszę o pomoc. Pewnie się domyśliliście po jakości kodu, ale zaznaczę, że mistrzem kodu nie jestem, więc prosiłbym proste wyjaśnienia.

0
  1. Tragiczne wcięcia, polecam http://format.krzaq.cc
  2. Po co *w1++? Wystarczy w1++, albo lepiej ++w1
for (w2 = separator; *w2 != '\0'; w2++) 
{
    if (*w1 != *w2) 
        cout << *w1;

Najpierw sprawdź czy *w1 jest równy jakiemukolwiek *w2, zmienna bool będzie idealna do tego celu. Po wyjściu z pętli jeśli zmienna bool mówi, że nie to dopiero wypisujesz.

bool czySeparator = false;
for (w2 = separator; *w2 != '\0'; ++w2) 
{
    if (*w1 == *w2) 
    {
        czySeparator = true;
        break;
    }
}

if (czySeparator)
    cout << " ";
else
    cout << *w1;

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