Kompilator nie pokazuje bledu, a jednak program sie wysypuje

0
#include<iostream>

using namespace std;

//DEKLARACJE FUNKCJI

void kopiowanie(char source[], char odd[], char even[]);
void drukowanie(char t[]);

//****************************************
int main()
{
    // DEKLARACJE TABLIC ORAZ ICH INICJALIZACJA
    char tablica1[]={"Byl czas, ze mial zone, a rownolegle,\
    w tajemnicy, dwie stale partnerki. Musial byc\
    czujny, zeby nie pomylic, ktorej co powiedzial."};
    char even[100]={"string"}, odd[100]={"string"};

    //WYWOLANIE FUNKCJI
    kopiowanie(tablica1, odd, even);
    drukowanie(odd);                                        //WYWOLANIE FUNKCJI DRUKUJACEJ TABLICE ODD NA EKRAN
    cout << endl;                                           //ZNAK NOWEJ LINII
    drukowanie(even);                                       //WYWOLANIE FUNKCJI DRUKUJACEJ TABLICE EVEN NA EKRAN

    return 0;
}
//****************************************
//FUNKCJA, KTORA KOPIUJE POSZCZEGOLNE WYRAZY Z GLOWNEJ TABLICY DO DWOCH INNYCH TABLIC W ZALEZNOSCI OD PARZYSTOSCI
void kopiowanie(char source[], char odd[], char even[])
{
    //ZMIENNA LOGICZNA DOTYCZACA PARZYSTOSCI
    bool parzystosc=false;

    for(int i=0, k=0, l=0; ; i++)
    {
        if(!parzystosc)                                      //JESLI ZMIENNA BOOL JEST FALSE, TO KOPIUJEMY DO NIEPARZYSTEJ TABLICY
        {
            while(source[i]!=' ') {odd[k]=source[i]; k++;}  //DOPOKI NIE NAPOTKA SPACJI-KOPIUJE WSZYSTKO DO NIEPARZYSTEJ
            if (source[i]==' ') {parzystosc=!parzystosc; }  //GDY NAPOTKA SPACJE-ZMIENIA WARTOSC ZMIENNEJ LOGICZNEJ NA PRZECIWNA...
        }
        else                                                //...I PRZECHODZIMY TUTAJ
        {
            while(source[i]!=' ') {even[l]=source[i]; l++;} //KOPIUJE DO TABLICY PARZYSTEJ DO MOMENTU NAPOTKANIA SPACJI
            if (source[i]==' ') {parzystosc=!parzystosc;}   //GDY NAPOTKA SPACJE-ZMIENIA WARTOSC ZMIENNEJ LOGICZNEJ NA PRZECIWNA...
        }                                                   //I POWTARZA TA PETLE AZ DO MOMENTU GDY...
    if(source[i]==0) {break;}                               //...NAPOTKA ZNAK NULL(KONCZACY STRING).BREAK KONCZY PETLE, A PROGRAM WRACA DO MAIN
    }
}
//****************************************
void drukowanie(char t[])
{
    int i=0;
    while(t[i]!=0) {cout << t[i]; i++;}
}
2
while(source[i]!=' ') {odd[k]=source[i]; k++;}

Jeśli warunek jest spełniony, jest to pętla nieskończona. k jest inkrementowane aż odd[k] przestaje być poprawnym wyrażeniem (tj. wychodzi poza zakres tablicy) i masz UB, a w efekcie crash.

Jak ja nie lubię bezokoliczników jako nazw funkcji. Czemu wszyscy nowicjusze się przy tym upierają?

1

Kod woła o pomstę do nieba, powinien się wstydzić pokazać na zajęciach

2

Przecież te pętle while wewnątrz for są nieskończone.

while(source[i]!=' ') {odd[k]=source[i]; k++;}

source[i] w każdej iteracji jest takie samo oraz różne od ' '.

0

Dzieki za pomoc. A propos to widze, ze duzo tutaj osob, ktore potrafia latwo krytykowac nowicjuszy, a przeciez kazdy kiedys zaczynal. Zalosne

Mowilem akurat o tym anonimie, a nie o pozostalych komentarzach.

0

Może tak:

void kopiowanie(char source[], char odd[], char even[])
  {
   char ch;
   for(bool which=false;(ch=*(source++))!=0;which^=(ch==' ')) (which?*(even++):*(odd++))=ch;
   *odd=*even=0;
  }

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