Strona 1 z 1

[C++] [SOLVED] getch() - wczytuje śmieci

: 14 gru 2010, 04:53
autor: falik
Witam, więc mój problem polega na tym że gdy wczytuje sobie za pomocą getch() do stringa to przy jego wypisaniu pojawiają mi się w nim dodatkowe znaki np. ^V, ^R itp.

Podejrzewam że jest tutaj coś nie tak z odczytywaniem niektórych znaków ale nie mam pojęcia jak temu zaradzić.

Przy inicjalizacji ncurses próbowałem właściwie wszystkich już kombinacji trybu wyświetlanie ale nie dało to żadnych efektów. Muszę dostawać w tym stringu czysty tekst pobrany od użytkownika bo wykorzystuję go później jakos nazwe pliku który otwieram no i przez te znaki mi wszystko sie sypie.

Ktoś ma jakiś pomysł ?

Odp: [C++] getch() - problem z odpowiednim wczytywaniem

: 14 gru 2010, 07:04
autor: ethanak
falik pisze:Ktoś ma jakiś pomysł ?
Rzuć kawałkiem kodu, bo dyżurna wróżka ma akurat urlop :)

Odp: [C++] getch() - wczytuje śmieci

: 14 gru 2010, 15:11
autor: falik

Kod: Zaznacz cały

// to jest funkcja pobierajaca stringa od uzytkownika
std::string read_filename()
{
	clear();
	mvprintw(5,5,"Wpisz nazwe pliku:\n");
	refresh();
	std::string tab;
	std::string::iterator it;
	it=tab.begin();
	char z=getch();
	int i=0;
	while(z!='\n')
	{
		*(it+i)=z;
		z=getch();
		i++;
	}
	return tab;
}
// tutaj wrzucam to do vectora
buffer.push_back(read_filename());
// a tu wyswietlam ( wiem ze tylko pierwszy el. ale nie zrobilem jeszcze petli, to tylko dla sprawdzenia czy dobrze zapisywane mam dane
void print()
{
	clear();
	bit=buffer.begin();
	std::string d1 = *(bit);
	mvprintw(2,2,d1.c_str());
	refresh();
}

Oczywiscie w glownym module programu wywoluje sobie te funkcje w odpowiednim momencie itp. Nie bede kopiowal przeciez tutaj tresci 5 plikow. Mysle ze to co wrzucilem to chyba wszystko co ma zwiazek z tym getch()

Odp: [C++] getch() - wczytuje śmieci

: 14 gru 2010, 16:01
autor: dawwin

Kod: Zaznacz cały

*(it+i)=z;
Wychodzisz tutaj poza ciąg znaków, który tak na dobrą sprawę jest pusty

Powinno być po prostu

Kod: Zaznacz cały

tab += z;

Odp: [C++] getch() - wczytuje śmieci

: 14 gru 2010, 16:09
autor: falik
Dzięki dzięki. Tak się składa, że udało mi się samemu dojść już do tego. Tylko nie rozumiem jeszcze do końca dlaczego iterator działa w pewnym sensie bo mimo wszystko wpisuje mi znaki do stringa tylko na końsu jakby dodaje jeszcze element ze śmieciem

Odp: [C++] getch() - wczytuje śmieci

: 14 gru 2010, 16:18
autor: dawwin
String realokuje sobie pamięć na znaki, kiedy używasz któregoś z operatorów przypisania lub jakiejś metody (funkcji) tej klasy. Używając iteratora masz dostęp do zaalokowanych już znaków, ale nie możesz zmienić rozmiaru ciągu. Więc jeśli masz w stringu 10 znaków to te 10 możesz nadpisać. Ciąg znaków w pamięci kończy się znakiem '\0', gdyż klasa string przechowuje w tablicy ciąg typu char (Jeśli pisałeś kiedyś w C to powinieneś to wiedzieć). Ty używając iteratora możesz zamazać znak końca i wtedy na końcu pojawiają się śmieci

Odp: [C++] getch() - wczytuje śmieci

: 14 gru 2010, 16:26
autor: falik
Ok rozumiem już, dzięki za wytłumaczenie. Dopiero zagłębiam się w stringi i vectory także sporo błędów mi wyskakuje, których nie rozumiem. Myślę, że teraz już wiem o co chodzi.

Temat chyba do zamknięcia. SOLVED