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

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
falik
Piegowaty Guziec
Piegowaty Guziec
Posty: 5
Rejestracja: 14 wrz 2010, 17:00
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

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

Post 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ł ?
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

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

Post autor: ethanak »

falik pisze:Ktoś ma jakiś pomysł ?
Rzuć kawałkiem kodu, bo dyżurna wróżka ma akurat urlop :)
Кто жопой родился, чижиком не помрёт
falik
Piegowaty Guziec
Piegowaty Guziec
Posty: 5
Rejestracja: 14 wrz 2010, 17:00
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

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

Post 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()
Awatar użytkownika
dawwin
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 202
Rejestracja: 18 kwie 2009, 09:16
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

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

Post 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;
Moje programy - http://dawwin.users.sourceforge.net/
Nie pomagam na PW
falik
Piegowaty Guziec
Piegowaty Guziec
Posty: 5
Rejestracja: 14 wrz 2010, 17:00
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

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

Post 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
Awatar użytkownika
dawwin
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 202
Rejestracja: 18 kwie 2009, 09:16
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

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

Post 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
Moje programy - http://dawwin.users.sourceforge.net/
Nie pomagam na PW
falik
Piegowaty Guziec
Piegowaty Guziec
Posty: 5
Rejestracja: 14 wrz 2010, 17:00
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

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

Post 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
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 13 gości