Metoda łącząca łańcuchy zwraca śmieci.

0

Zapewne mój problem bierze się z jakiegoś głupiego błędu, ale niestety nie potrafię go usunąć. Mianowicie, potrzebuję stworzyć w klasie Data metodę WyswietlDate, która ma za zadanie połączyć pola Dzien, "-", Miesiac, "-" i Rok, a potem zwrócić je.

Treść metody napisanej przeze mnie:

char *WyswielDate() const
{
	char dzien[3], miesiac[3], rok[5], data[20];

	_itoa_s(Dzien, dzien, 10); strcpy_s(data, dzien); strcat_s(data, "-");
	_itoa_s(Miesiac, miesiac, 10); strcat_s(data, miesiac); strcat_s(data, "-");
	_itoa_s(Rok, rok, 10); strcat_s(data, rok);

	return data;
}

Gdy wyświetlam w tej metodzie wartość zmiennej data to działa ona właściwie, ale gdy wywołuję metodę z programu to wysypują się z niej śmieci.

Wywołanie:

data = new Data(st.wDay, st.wMonth, st.wYear);
cout<<data->WyswielDate();

Z góry dziękuję za wszelką pomoc.

//edit:

Dzien, Miesiac i Rok to pola typu unsigned int.

0

Nie bardzo wiem co kombinujesz bo darowalem sobie czytanie tego, ale tak sie laczy napisy:
http://ideone.com/AiOGQg
Kilka uwag jeszcze dopisze:

  • styl, w ktorym to jest napisane jest ogolnie przyjetym stylem powodujacym bledy (zwracanie nie statycznej tablicy na stosie)
  • liste parametrow jakie moze ta funkcja przyjmowac (co moze wrzucac do bufora) znajdziesz w dokumentacji printfa (bodajze przy sprintf jest odnosnik)
  • nie zadziala (nie powinno w normalnym jezyku) jesli nie przekazesz wyniku bezposrednio do innej funkcji (a i to nie jest pewne rozwiazanie)
  • na twoim miejscu pierwsze co mi przychodzi do glowy to bufer przesylac jako argument funkcji (argument-wynik) i do niego ladowac wydobyty string
  • jeszcze jedno rozwiazanie, zacznij uzywac C++ (bo to wbrew pozorom nie jest C z coutem)
0
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    string data = "";
    ostringstream oss;

    int dzien = 10;
    int miesiac = 10;
    int rok = 2010;

    oss << dzien << "-" << miesiac << "-" << rok;
    data = oss.str();
    cout << data;
    return 0;
}
 
0

Po wprowadzeniu poprawek na podstawie kodu od n0name_l uzyskałem coś takiego:

class Data
{
	unsigned int Dzien, Miesiac, Rok;

...

	char *WyswielDate()
	{
		char data[11];
	
		sprintf_s(data, "%d-%d-%d", Dzien, Miesiac, Rok);

		cout<<data;	// <- TUTAJ DATA WYŚWIETLA SIĘ DOBRZE

		return data;
	}
}

A po wywołaniu:

data = new Data(st.wDay, st.wMonth, st.wYear);
cout<<data->WyswielDate();

pojawia się:
921857257518658abe8076.png

1

poczytaj o zasięgu zmiennych. Używasz czegoś, czego już nie ma (w main)

1

Nastepnym razem czytaj (albo mysl) co masz zrobic.
http://ideone.com/x7Wot8
http://ideone.com/ARPRiT
http://ideone.com/Uu7ICm
najladniejsze ostatnie.

0

Dziękuję wszystkim za pomoc, już działa :)

Mam jeszcze jedno pytanie. Nie będę zakładał osobnego tematu dla takiej pierdółki...

Potrzebuję stworzyć pętlę w której program będzie wyświetlał menu i czekał minutę na reakcję użytkownika. Jeśli użytkownik w ciągu minuty naciśnie jakikolwiek klawisz to czas zatrzyma się i będą wykonywane dalsze operacje, a jeśli nie naciśnie to dalsza część kodu będzie pominięta, pętla zostanie ponownie wykonana, a czas zacznie się odliczać od nowa. W jaki sposób coś takiego wykonać? O ile w ogóle coś takiego można wykonać...

0

Dzięki za nazwy funkcji :-)

Napisałem coś takiego:

while(true)
{
	cout<<"1. Opcja 1"<<endl
		<<"2. Opcja 2"<<endl
		<<"3. Opcja 3"<<endl
		<<"Wybor: ";

	Sleep(1000);

	if(_kbhit())
	{
		c = _getch();
		cout<<"Wybrales "<<c;
	}
}

Teoretycznie działa dobrze, ale jest z tym kodem jeden problem. Mianowicie, po wciśnięciu jakiegoś przycisku nie pojawia on się od razu tylko trzeba czekać aż minie czas aby akcja została wykonana. Teraz to nie problem ale w projekcie który robię muszę to zastosować z opóźnieniem w okolicach kilku minut...

1
wyswietl menu
wlacz licznik_czasu
petla:
    jezeli licznik_czasu > 1 minuta
        zrestartuj licznik_czasu
        kontynuuj
    jezeli kbhit()
        wylacz licznik_czasu
        przerwij

dalsze instrukcje

Cos takiego w najprostszej formie.

time_t start, now;
start = time(NULL)
while(true)
{
    now = time(NULL);
    if(difftime(now, start) > 60.0)
    {
        start = time(NULL);
        continue;
    }
    if(kbhit())
        break;
}

// dalsze instrukcje
0

Wielki dzięki, przerobiłem trochę Twój kod i wszystko śmiga. Masz u mnie wielkie piwo :-)

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