Kopiowanie zawartości stringa do dwóch tablic

0

Programersi mam wielką prośbe ; )

Mamy tablicę znaków, w której znajduje się długi C-string będący tekstem, składającym się z kilkunastu wyrazów. Napisz funkcje, która przekopiuje ten C-String do dwóch innych tablic. W tablicy parzyste znaleźć mają się parzyste wyrazy C-stringu, a w tablicy nieparzyste – nieparzyste wyrazy C-stringu. W obu docelowych tablicach wyrazy mają być oddzielone odstępami(spacjami), czyli znakami ' '. Funkcja ta ma być wywoływana z trzema argumentami:

  • adres tablicy źródłowej,
  • adres tablicy na wyrazy parzyste,
  • adres tablicy na wyrazy nieparzyste.

Pomóżcie mi ogarnąć gdzie popełniłem błąd, nie chce programu gotowego tylko pomocy ; )

#include <iostream>
#include <cstring>
using namespace std;
void funkcja_kopiujaca(char zrodlo[],char tu_parzyste[],char tu_nieparzyste[])
{ 
int roznica=0;
int z=0;
int i=0;


for(i=0;;i++)
   {


   if(zrodlo[i]==' '){
   roznica=i-z;

        if(!(roznica%2)){

            for(z;z<roznica;z++)
            { tu_parzyste[z]=zrodlo[z];
               z=i;
               if(zrodlo[z]==0)break;

            }
}
else{
for(z;z<roznica;z++)
            { tu_nieparzyste[z]=zrodlo[z];
                 z=i;
                 if(zrodlo[z]==0)break;
}
}

   }

if(zrodlo[i]==0)break;


}



}

int main()
{ char c[200]={"Wielki string sprawdzajacy czy zostalo poprawnie wykonane"};
  char parzyste[200];
  char nieparzyste[200];
funkcja_kopiujaca(c, parzyste, nieparzyste);
for (int i=0;i<200;i++)
{
cout << parzyste[i];
}
cout <<endl<<endl;

for (int i=0;i<200;i++)
{
cout << nieparzyste[i];
}

    return 0;
}
0
int roznica;
int z = 0;
int i = 0;

te rzeczy powinny być w funkcji, a nie latać na zewnątrz jako zmienne globalne.

tu_parzyste[z] = zrodlo[z];

indeks, pod którym jest dana literka w tablicy źródłowej na pewno nie będzie równy indeksowi, gdzie należy tę literkę zapisać (w większości przypadków poza pierwszym wyrazem)

z = i;

co to ma robić?

1

zmien tytul. "Bardzo prosze o pomoc" to nie jest dobra nazwa na temat
wrzuce tu Twoj kod w formacie w ktorym da sie czytac.

#include <iostream>
#include <cstring>
using namespace std;
int roznica;
int z = 0;
int i = 0;
void funkcja_kopiujaca(char zrodlo[], char tu_parzyste[], char tu_nieparzyste[])
{
    for (i = 0;; i++) {

        if (zrodlo[i] == ' ') {
            roznica = i - z;

            if (!(roznica % 2)) {

                for (z; z < roznica; z++) {
                    tu_parzyste[z] = zrodlo[z];
                    z = i;
                    if (zrodlo[z] == 0)
                        break;
                }
            }
            else {
                for (z; z < roznica; z++) {
                    tu_nieparzyste[z] = zrodlo[z];
                    z = i;
                    if (zrodlo[z] == 0)
                        break;
                }
            }
        }

        if (zrodlo[i] == 0)
            break;
    }
}

int main()
{
    char c[200] = { "Wielki string sprawdzajacy czy zostalo poprawnie wykonane" };
    char parzyste[200];
    char nieparzyste[200];
    funkcja_kopiujaca(c, parzyste, nieparzyste);
    for (int i = 0; i < 200; i++) {
        cout << parzyste[i];
    }
    cout << endl
         << endl;

    for (int i = 0; i < 200; i++) {
        cout << nieparzyste[i];
    }
    return 0;
}
 

uzyj strlen do sprawdzenia jak dlugi jest napis. Bo ten for loop nieskonczonosci jest po prostu niepotrzebny

bledu nie widziales wlasnie przez Twoje beznadziejne formatowanie

if (zrodlo[i] == ' ') 

caly Twoj kod jest w tym ifie. Czyli jezeli to jest spacja to rob co tam trzeba. (od 11 linijki do 32)

masz zrobic to tak

  1. jezeli to NIE jest spacja wpisz znak do tablicyA
  2. jezeli to spacja wpisz to do tablicyA ale zmien teraz tablice na tabliceB

dam pseudokod

char* tmp = tablicaA;
for (int i ; i < dlugosc_tablicy ; i++)
{
  if(source[i] != ' ')
  {
    tmp[i] = source[i];
  } 
  else 
  {
    tmp[i] = ' ';
    if (tmp == tablicaA)
    {
      tmp = tablicaB;
    }
    else
    {
      tmp = tablicaA;
    }
  }
}
1

Dyskusję na temat prowadź w postach zamiast komentarzach.

tu_parzyste[z]=zrodlo[z];

to jest przecież przypisanie a nie przyrównanie
Wiem o tym. Za to Ty nie rozumiesz o co mi chodzi. Na przykładzie:

zrodlo = [a][m][ ][c][ ][b][m]

// no to przypisujemy:
parzyste[0] = zrodlo[0]   // a
parzyste[1] = zrodlo[1]   // m

nieparzyste[0] = zrodlo[3]  // c
//zauważ, że indeksy się różnią
0

Dzięki @twonek
już trochę pozmieniałem i trochę się już udało napisać spróbuje sam poogarniać i jak nie dam rady to spostuje.
@fasadin nie przerabiałem jeszcze wskaźników
jest postep xD

string sprawdzajacy cz)���H>�pj��`

Wielki�H>��V]!��`���

0
#include <iostream>
#include <cstring>
using namespace std;
void funkcja_kopiujaca(char zrodlo[], char tu_parzyste[], char tu_nieparzyste[])
{

int roznica=0;
int z = 0;
int i = 0;
int m = 0;
int n = 0;
    for (i = 0;i<57; i++) { //napis zawiera 57 miejsc w tabeli

        if (zrodlo[i] == ' ') {
            roznica = (i-1) - z; // zmniejszam o jeden bo ostatnim znakiem musi byc litera a nie spacja

            if ((roznica % 2)) {

                for (z; z <= (roznica+1); z++) {
                    tu_parzyste[m] = zrodlo[z];
                     m=(m+1);
                     if (zrodlo[z] == 0)
                        break;
                }


            }
            else {
                for (z; z <= (roznica+1); z++) {
                    tu_nieparzyste[n] = zrodlo[z];
                    n=(n+1);

                    if (zrodlo[z] == 0)
                        break;
                }
            }

        }
             z=i;
        if (zrodlo[i] == 0)
            break;
    }

}

int main()
{
    char c[200] = { "Wielki string sprawdzajacy czy zostalo poprawnie wykonane" };


    char parzyste[200];
    char nieparzyste[200];
    funkcja_kopiujaca(c, parzyste, nieparzyste);
    for (int i = 0; i < 57; i++) {
        cout << parzyste[i];
    }
    cout << endl
         << endl;

    for (int i = 0; i < 57; i++) {
        cout << nieparzyste[i];
    }
    return 0;
}

skończyłem na tym ale nadal nie wiem co robię źle bo mój sposób wydaje mi się naprawdę racjonalny

0

cytujac samego siebie

bledu nie widziales wlasnie przez Twoje beznadziejne formatowanie

if (zrodlo[i] == ' ') 

caly Twoj kod jest w tym ifie. Czyli jezeli to jest spacja to rob co tam trzeba. (od 11 linijki do 32)

wiec jezeli jest spacja to NIE KOPIUJE DANYCH. Wiec tylko kopiuje spacje...

i zadne 57 (magiczna liczba) tylko uzyj strlen
http://www.cplusplus.com/reference/cstring/strlen/

dodatkowo nie przeczytales mojego posta bo napisalem CI pseudokod (bez wskaznikow tez Ci odpisalem w komentarzu)

0
Charllie napisał(a):
 char c[200] = { "Wielki string sprawdzajacy czy zostalo poprawnie wykonane" };

To powinno wyglądać tak:

const char *c = "Wielki string sprawdzający czy zostało poprawnie wykonane";

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