#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++;}
}
0
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;
}