• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tablica automatycznie wypełniona znakami

VPS Starter Arubacloud
0 głosów
1,377 wizyt
pytanie zadane 19 sierpnia 2017 w C i C++ przez Paweł Nąckiewicz Nałogowiec (48,990 p.)

Witam,

na wstępie dodam iż jestem po dniu intensywnej pracy z C++ więc możliwe że rozwiązanie jest banalna ale ja już nie mam świeżego oka to znalezienia rozwiązania.

 

Wykonuję zadanie z książki Symfonia C++ (J.Grębosz) jestem przy temacie z tablicami a za zadanie mam z 1 tablicy w której jest jakieś zdanie przekopiować do 2 innych tablic zawartość tego zdania z podziałem na znaki o indeksie parzystym i nieparzystym.

 

Tak wygląda deklaracja moich tablic i możliwe, że tutaj wystarczy coś zmienić bo debuger podpowiada że na starcie już mam dziwne wartości (później są one tylko nadpisywane)

	char napis[] = "Alfabet sklada sie z wielu znakow";
	char tabParz[17];
	char tabNieparz[17];

 

A tutaj podaję cały kod, wiem, że fragmentami jest on zbyt bardzo skomplikowany i da się to zrobić prościej ;)

#include <iostream>

using namespace std;
void zadanie18(char zrodlo[], char parzyste[], char nieprzyste[]);
void printAr(char tab[]);

int main()
{
	char napis[] = "Alfabet sklada sie z wielu znakow";
	char tabParz[17];
	char tabNieparz[17];

	zadanie18(napis, tabParz, tabNieparz);
	cout << "Glowna tablica: \t";
	printAr(napis);
	cout << "\nParzyste: \t";
	printAr(tabParz);
	cout << "\nNieparzyste: \t";
	printAr(tabNieparz);

	system("PAUSE");
}
void printAr(char tab[])
{
	int i = 0;
	while (tab[i])
	{
		cout << tab[i];
		i++;
	}
	cout << endl;
}


void zadanie18(char zrodlo[], char parzyste[], char nieprzyste[])
{
	static int i, licznikParzyst, licznikNieparzysty;
	for (i = 0; (zrodlo[i]); i++)
	{

		if (zrodlo[i] != 0)
		{

			if (i % 2)
			{
				nieprzyste[licznikNieparzysty] = zrodlo[i];
				licznikNieparzysty++;
			}
			else
			{
				parzyste[licznikParzyst] = zrodlo[i];
				licznikParzyst++;
			}
		}
		else break;
	}
}

 

1 odpowiedź

+1 głos
odpowiedź 19 sierpnia 2017 przez vector Dyskutant (9,200 p.)
wybrane 15 marca 2020 przez Paweł Nąckiewicz
 
Najlepsza
char tabParz[17];
char tabNieparz[17];

Te tablice nie są globalne i nie są zainicjalizowane więc zawierają jakieś losowe śmieci w sobie które zostały w ramie co powoduje że ta petla

while (tab[i])

nigdy sie nie zatrzyma, aby to naprawić wystarczy że dodasz na samym końcu funkcji zadanie18 ręcznie terminatory ciągu.

void zadanie18(char zrodlo[], char parzyste[], char nieprzyste[]) {
	static int i, licznikParzyst, licznikNieparzysty;
	for(i = 0; (zrodlo[i]); i++) {

		if(zrodlo[i] != 0) {

			if(i % 2) {
				nieprzyste[licznikNieparzysty] = zrodlo[i];
				licznikNieparzysty++;
			} else {
				parzyste[licznikParzyst] = zrodlo[i];
				licznikParzyst++;
			}
		} else
			break;
	}
	nieprzyste[licznikNieparzysty] = '\0';  // TUTAJ
	parzyste[licznikParzyst]       = '\0';  // TUTAJ
}

Dodatkowo parzystych znaków w tablicy 33 znakowej jest 17 a licząc z termiatorem masz 18 znaków które musisz przechować w tablicy czyli powinieneś również zmienić rozmiar tablicy przechowującej znaki parzyste.

//Edit

Nie wiem dlaczego piszesz funkcje do wypisywania tablicy ciągów skoro std::cout sobie z tym świetnie radzi.

cout << napis << endl;
cout << tabParz << endl;
cout << tabNieparz << endl;
komentarz 19 sierpnia 2017 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
Takiego rozwiązania się nie spodziewałem a przyznam, że jest banalne :)

Dzięki za pomoc

Podobne pytania

0 głosów
0 odpowiedzi 927 wizyt
0 głosów
1 odpowiedź 671 wizyt
0 głosów
1 odpowiedź 222 wizyt
pytanie zadane 7 grudnia 2022 w C i C++ przez Janchess Początkujący (480 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...