[C++] Kopiowanie tablic znakowych i wyświetlanie ich zawartości

0

Cześć wszystkim.

Mam napisać program, który, mając podany C-string, ma podzielić go do dwóch tablic tak, aby do jednej wpisywał jego parzyste litery, a do drugiej nieparzyste a następnie wypisywał oba nowe powstałe ciągi. Funkcja kopiująca ma być wywoływana z trzema argumentami (adres t. źródłowej, adres tabl. na wyrazy parzyste i tabl. na wyrazy nieparzyste).

Wygląda to mniej więcej tak:

Ciąg: "Trufle"
Parzysto: "T u l "
Nieparzysto: " r f e"

Oto moje wypociny:


#include "stdafx.h"
#include <iostream>
using namespace std;

void rozdzielacz(char zrodlo[], char parzyste[], char nieparzyste[]);
void drukuj(char tablica[], int rozmiar);
//++++++++++++++++++++++++++++++++++++++++++++++++++
int _tmain(int argc, _TCHAR* argv[])
{
	cout << "Program ma za zadanie dzielic podany C-string na parzyste/nieparzyste\n";
	const int rozmiar = 50;
	char dzielony[rozmiar] = { "Mam wszystko w tyle" };
        drukuj(dzielony, rozmiar);
	char parzyste[rozmiar];
	char nieparzyste[rozmiar];


	rozdzielacz(dzielony, parzyste, nieparzyste);
	
	drukuj(parzyste, rozmiar);
	drukuj(nieparzyste, rozmiar);
	

	return 0;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++
void rozdzielacz(char zrodlo[], char parzyste[], char nieparzyste[])
{
	int i = 0;
	do
	{
		if(i % 2)
		{
			nieparzyste[i] = zrodlo[i];
			parzyste[i] = ' ';
		}
		else 
		{
			parzyste[i] = zrodlo[i];
			nieparzyste[i] = ' ';
		}
	}while(!zrodlo[i++] == '\0');
	if(nieparzyste[i] != '\0') nieparzyste[++i] = '\0';
	else if(parzyste[i] != '\0') parzyste[++i] = '\0';
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++
void drukuj(char tablica[], int rozmiar)
{
	int i = 0;
	for(i =0; i < rozmiar; i++)
	{
		cout << tablica[i];
	}
	
	cout << endl;
}

Mój problem polega na tym, że po wywołaniu funkcji drukuj obie tablice zostają wydrukowane poprawnie do momentu, gdy skończą się w nich skopiowane znaki, a potem pojawiają się jakieś krzaki. Czy mógłby mi ktoś powiedzieć, w jaki sposób edytować funkcję drukuj, aby po wydruku skopiowanych z podanego stringu znaków "wartoścowych" (czyli wszystkich liter i znaków spacja) zakończyła swoje działanie?

Z góry dziękuję za odpowiedzi. Pozdrawiam

2

O to ci chodziło ??
Trochę masz tam niezbędnego kodu wrzucone...

#include <iostream>
using namespace std;

void rozdzielacz(char zrodlo[], char parzyste[], char nieparzyste[]);

//++++++++++++++++++++++++++++++++++++++++++++++++++
int main()
{
        cout << "Program ma za zadanie dzielic podany C-string na parzyste/nieparzyste\n";
        const int rozmiar = 50;
        char dzielony[rozmiar] = { "Mam wszystko w tyle" };
        char parzyste[rozmiar];
        char nieparzyste[rozmiar];

        rozdzielacz(dzielony, parzyste, nieparzyste);

        cout << nieparzyste<<endl;  // funkcja drukuj nie potrzebna cout wystarczy w zupełności
        cout << parzyste << endl;

        return 0;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++
void rozdzielacz(char zrodlo[], char parzyste[], char nieparzyste[])
{
        int i = 0;
        do
        {
                if(i % 2)
                {
                        nieparzyste[i] = zrodlo[i];
                        parzyste[i] = ' ';
                }
                else
                {
                        parzyste[i] = zrodlo[i];
                        nieparzyste[i] = ' ';
                }
        }while(zrodlo[i++] != '\0'); // sprawdzasz czy następny znak nie jest znakiem końca ciągu

        parzyste[i] = '\0'; // przypisać musisz dla parzystych oraz nieparzystych najlepiej znak końca dla bezpieczeństwa
        nieparzyste[i] = '\0';

}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++

0

To twój tekst:

const int rozmiar = 50;
char dzielony[rozmiar] = { "Mam wszystko w tyle" };

Gdzie tam według ciebie jest znak '\0'?

for(i =0; i < rozmiar; i++)
        {
                cout << tablica[i];
        }

A czemu wyświetlasz 50 znaków?

Powienieneś wyświetlać aż napotkasz znak '\0'. A w twojej tablicy jest coś takiego: "Mam wszystko w tyle$%$#%$#@#@%#$$#@$%@$##%#$#$@%\0", bo te krzaki to dopełnienie do 50 znaków. Więc i tekst powienieneś inaczej podać.

0

@aurel Z tego co pisze w symfonii c++, jeśli inicjalizujesz tablice w taki sposób:

char znaki[50] = {"bla bla bla"};

To kompilator automatycznie wykryje, że inicjalizujemy tę tablicę C-stringiem, a co za tym idzie, sam sobie dopisze znak '\0'. A reszta zostanie zainicjalizowana zerami, a przecież kod znaku NULL to też 0.

EDIT: Już chyba wiem o co Ci chodziło. Tablica dzielony jest inicjalizowana, ale dwie pozostałe już nie, więc są w nich śmieci, muszę poprawkę na to wziąć ;)

@goransol

Dzięki serdeczne, po twoich poprawkach już wszystko jest w porządku :)
Pozdrawiam

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.