Ĺadny brzuch
Gdzie w poniższym kodzie jest błąd?:
#include <iostream> #include <string> using namespace std; int main() { char *tab; int ile; cout << "Ile znakow?: "; cin >> ile; tab = new char[ile]; cout << "Co?: "; cin.get(tab,9); cout << tab << endl; cout << tab << " ma " << strlen(tab) << " znakow." << endl; delete[] tab; system("PAUSE"); return 0; }
Wszystko mi działa tylko wtedy, kiedy nie określam jaki ma być rozmiar tablicy, czyli np:
char *tab = new char[10];
Proszę o odpowiedź.
damn it nie pamietam dokladnie jak to bylo ale chyba trzeba wyczyscic bufor strumienia, jakies funkcje typu flush() albo fflush(), mozliwe ze metody klasy istream albo ios... w takich tematach bym poszukal
ps.
Wszystko mi działa tylko wtedy, kiedy nie określam jaki ma być rozmiar tablicy, czyli np:
char *tab = new char[10];
jestes pewien ze chodzi o okreslanie rozmiaru tablicy a nie o uzycie I cin'a?
ps2. hmm.. za doozo ci chyba nie pomoglem ;)
#include <string>
l_ahriman miałeś rację, gdy usunę pierwszy cin to wszystko działa. Np tak:
#include <iostream> #include <string> using namespace std; int main() { Â char *tab; Â tab = new char[5]; Â cout << "Co?: "; Â cin.get(tab,4); Â cout << tab << endl; Â cout << tab << " ma " << strlen(tab) << " znakow." << endl; Â delete[] tab; Â system("PAUSE"); Â return 0; }
ale jak mam zrobić, aby użytkownik sam mógł podać rozmiat tablicy znaków?
Użytkownik comp123 edytował ten post 17 czerwiec 2005, 16:22
Najprościej można na przykład dać zamiast cin.get(tab,9); cin>>tab;
tylko że wtedy tracisz możliwość ograniczania do 9 znaków, więc jeżeli ta 9 jest istotna w tym kodzie to nie jest rozwiązanie. :P
Nie jest istotne, ale ważne dla mojej nauki. Przecież gdy czegoś nie rozumiem, nie mogę tego pominąć, lecz muszę podjąć próbę. Gdybym natomiast użył cin >> tab; to łańcuch zostałby wprowadzony(z tego co wiem) do pierwszego znaku rozdzielającego, np. spacji. A ja chcę żeby mój program działał z podanymi założeniami. Więc czekam na tą właściwą odpowiedź...
A więc czy ktoś wie co jest tu źle?:
#include <iostream> #include <string> using namespace std; int main() { Â char *tab; Â int ile; Â cout << "Ile znakow?: "; Â cin >> ile; Â tab = new char[ile]; Â cout << "Co?: "; Â cin.get(tab,9); Â cout << tab << endl; Â cout << tab << " ma " << strlen(tab) << " znakow." << endl; Â delete[] tab; Â system("PAUSE"); Â return 0; }
Użytkownik comp123 edytował ten post 17 czerwiec 2005, 17:42
Nie jestem pewny, ale zdaje sie ze powinieneś dać new char[ile+1], bo skoro to jest string , a stringi w c++ sa zakonczone \0 (null terminated) to chyba musisz zostawic dla tego znaku miejsce ;)
Niestety dalej niedziała.
eeeh.... czlowieku - uzyj DEBUGERA !. Jak bys uzyl to nawet by nie bylo tego topicka :/ ... czemu na tym swiecie malo kto uzywa debugerow ?. Przecie po to sa ...
A tak pomijajac to, to nie widzisz naprawde innego glupiego bledu ??. Podajesz ilosc znakow, alokujesz tablice na te ilosc, a potem dajesz ograniczenie do 9 znakow ... a co jak ja sobie wpisze 3 znaki ?. Ja wiem ze raster alokacji jest 16 bajtow - ale ty tego nie wiesz i nie powinienes takich baboli robic bo cie spotka pan acces violation w koncu.
Wez no sobie ustaw breakpointa po wczytaniu do zmiennej "ile" i zobacz co ona w ogole ma a nie jak zwykle "podajcie mi kod" ...
Użytkownik st3tc edytował ten post 18 czerwiec 2005, 08:56
Dalej nie Wiem co zrobić, aby ten kod działał. A skoro jesteście tacy mądrzy sami napiszcie mi jego poprawną wersję i niech będzie chwała Wam za to.
#include <iostream> #include <string> using namespace std; int main() { Â char *tab; Â int ile; Â cout << "Ile znakow?: "; Â cin >> ile; Â tab = new char[ile]; Â cout << "Co?: "; Â cin.get(tab, ile); Â cout << tab << endl; Â cout << tab << " ma " << strlen(tab) << " znakow." << endl; Â delete[] tab; Â system("PAUSE"); Â return 0; }
Program się kompiluje, nie wyskakują żadne błedy. Dokładnie wygląda to tak:
Ile znakow?: (wpisuję np. 10 i daję ENTER, a dalej już program sam się wypełnia przypadkowymi wartościami)
Co?:
ma 0 znakow.
Aby kontynuować naciśnij dowolny klawisz...
A co do klastra (a nie rastra) alokacji - panie st3tc - wiem że ma 16 bajtów.
Użytkownik comp123 edytował ten post 18 czerwiec 2005, 09:25
A co do klastra (a nie rastra) alokacji - panie st3tc - wiem że ma 16 bajtów.
st3tc nie mam zamiaru się z Tobą przedżeźniać, lecz oczekuję odpowiedzi na postawiony przeze mnie wcześniej problem.
Ekchu ekchu... ja mam takie dziwne wrazenie ze odpowiedz zostala juz udzielona O_o
Jak to dopowiedź została udzielona? Czy ktoś mi podał konkretną odpowiedź? Przecież prosiłem o podanie właściwego kodu, bo ten mi nie działa.
#include <iostream> #include <string> using namespace std; int main() { char *tab; int ile; cout << "Ile znakow?: "; cin >> ile; tab = new char[ile]; cout << "Co?: "; cin.get(tab, ile); cout << tab << endl; cout << tab << " ma " << strlen(tab) << " znakow." << endl; delete[] tab; system("PAUSE"); return 0; }
Program się kompiluje, nie wyskakują żadne błedy. Dokładnie wygląda to tak:
Ile znakow?: (wpisuję np. 10 i daję ENTER, a dalej już program sam się wypełnia przypadkowymi wartościami)
Co?:
ma 0 znakow.
Aby kontynuować naciśnij dowolny klawisz...
Napiszcie konkretnie co jest źle, tak, aby wreszcie kod zadziałał.
jooz chyba wiem
daj po pierwszym cin >>... nastepujace wywolanie:
cin.ignore();
teraz powinno dzialac mi sie zdaje
1) wyglada na to ze get( *char str, int i ) wpisuje do tablicy i - 1 elementow + null na koncu ( czyli chcac wczytac rzeczywistych znakow tyle ile dostajesz odpowiedz od usera na poczatku i w alokowaniu tablicy musisz uzyc argumentu ile + 1 i w funkcji get( str, ile + 1 );
to chyba rozwiazuje twooj problem mi sie zdaje
btw nie wiem czy to jest eleganckie rozwiazanie ale u mnie to dziala ( choc moze wcale tak nie powinno sie robic... )
Użytkownik l_ahriman edytował ten post 18 czerwiec 2005, 15:08
dzięki l_ahriman, wreszcie rozwiązałeś mój problem. B) Ale jeszcze tak z ciekawości zapytam za co odpowiada metoda cin.ignore()?
Użytkownik comp123 edytował ten post 18 czerwiec 2005, 15:17
dzięki l_ahriman, wreszcie rozwiązałeś mój problem. B) Ale jeszcze tak z ciekawości zapytam za co odpowiada metoda cin.ignore()?
ignore nie czysci strumienia. on po prostu ignoruje znaki wprowadzane przez uzytkwonika az do osiagniecia n znakow, lub parametru delim. Jezeli nie podasz zadnego parametru, to n wynosi domyslnie 1, a znakiem konczacym jest EOL czyli znak nowej lini :D Zastosowanie tej metody nmie jest zlym pomyslem. Jednak do wczytywania calych zdan proponuje metode getline. Bo get z zasady kojarzony jest z wczytywamniem pojedynczego znaku.
st3tc, daj sobie spokoj, nie ma co tracic nerwow :) comp123 - a tak swoja droga, to przeczytales jakas ksiazke do konca? tzn mam na mysli podrecznik do C++ itp.
st3tc, daj sobie spokoj, nie ma co tracic nerwow comp123 - a tak swoja droga, to przeczytales jakas ksiazke do konca? tzn mam na mysli podrecznik do C++ itp.
A po co pytasz? Mistrzem programowania to ja nie jestem, a akurat problemy, na które zadaje pytania nie mogłem znaleźć w moich książkach(to chyba oczywiste, po to jest to forum).
no ok ok, mnie tu nie ma w koncu ;) w kazdym razie nie uwazam, zeby do tego wlasnie sluzylo forum :)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
#include <iostream> #include <string> using namespace std; int main() { char *tab; int ile; cout << "Ile znakow?: "; cin >> ile; tab = new char[ile]; cout << "Co?: "; cin.get(tab,9); cout << tab << endl; cout << tab << " ma " << strlen(tab) << " znakow." << endl; delete[] tab; system("PAUSE"); return 0; }
Wszystko mi działa tylko wtedy, kiedy nie określam jaki ma być rozmiar tablicy, czyli np:
char *tab = new char[10];
Proszę o odpowiedź.
damn it nie pamietam dokladnie jak to bylo ale chyba trzeba wyczyscic bufor strumienia, jakies funkcje typu flush() albo fflush(), mozliwe ze metody klasy istream albo ios... w takich tematach bym poszukal
ps.
Wszystko mi działa tylko wtedy, kiedy nie określam jaki ma być rozmiar tablicy, czyli np:
char *tab = new char[10];
jestes pewien ze chodzi o okreslanie rozmiaru tablicy a nie o uzycie I cin'a?
ps2. hmm.. za doozo ci chyba nie pomoglem ;)
#include <string>

l_ahriman miałeś rację, gdy usunę pierwszy cin to wszystko działa. Np tak:
#include <iostream> #include <string> using namespace std; int main() { Â char *tab; Â tab = new char[5]; Â cout << "Co?: "; Â cin.get(tab,4); Â cout << tab << endl; Â cout << tab << " ma " << strlen(tab) << " znakow." << endl; Â delete[] tab; Â system("PAUSE"); Â return 0; }
ale jak mam zrobić, aby użytkownik sam mógł podać rozmiat tablicy znaków?
Użytkownik comp123 edytował ten post 17 czerwiec 2005, 16:22
Najprościej można na przykład dać zamiast cin.get(tab,9); cin>>tab;
tylko że wtedy tracisz możliwość ograniczania do 9 znaków, więc jeżeli ta 9 jest istotna w tym kodzie to nie jest rozwiązanie. :P
Nie jest istotne, ale ważne dla mojej nauki. Przecież gdy czegoś nie rozumiem, nie mogę tego pominąć, lecz muszę podjąć próbę. Gdybym natomiast użył cin >> tab; to łańcuch zostałby wprowadzony(z tego co wiem) do pierwszego znaku rozdzielającego, np. spacji. A ja chcę żeby mój program działał z podanymi założeniami. Więc czekam na tą właściwą odpowiedź...
A więc czy ktoś wie co jest tu źle?:
#include <iostream> #include <string> using namespace std; int main() { Â char *tab; Â int ile; Â cout << "Ile znakow?: "; Â cin >> ile; Â tab = new char[ile]; Â cout << "Co?: "; Â cin.get(tab,9); Â cout << tab << endl; Â cout << tab << " ma " << strlen(tab) << " znakow." << endl; Â delete[] tab; Â system("PAUSE"); Â return 0; }
Użytkownik comp123 edytował ten post 17 czerwiec 2005, 17:42
Nie jestem pewny, ale zdaje sie ze powinieneś dać new char[ile+1], bo skoro to jest string , a stringi w c++ sa zakonczone \0 (null terminated) to chyba musisz zostawic dla tego znaku miejsce ;)
Niestety dalej niedziała.
eeeh.... czlowieku - uzyj DEBUGERA !. Jak bys uzyl to nawet by nie bylo tego topicka :/ ... czemu na tym swiecie malo kto uzywa debugerow ?. Przecie po to sa ...
A tak pomijajac to, to nie widzisz naprawde innego glupiego bledu ??. Podajesz ilosc znakow, alokujesz tablice na te ilosc, a potem dajesz ograniczenie do 9 znakow ... a co jak ja sobie wpisze 3 znaki ?. Ja wiem ze raster alokacji jest 16 bajtow - ale ty tego nie wiesz i nie powinienes takich baboli robic bo cie spotka pan acces violation w koncu.
Wez no sobie ustaw breakpointa po wczytaniu do zmiennej "ile" i zobacz co ona w ogole ma a nie jak zwykle "podajcie mi kod" ...
Użytkownik st3tc edytował ten post 18 czerwiec 2005, 08:56
Dalej nie Wiem co zrobić, aby ten kod działał. A skoro jesteście tacy mądrzy sami napiszcie mi jego poprawną wersję i niech będzie chwała Wam za to.
#include <iostream> #include <string> using namespace std; int main() { Â char *tab; Â int ile; Â cout << "Ile znakow?: "; Â cin >> ile; Â tab = new char[ile]; Â cout << "Co?: "; Â cin.get(tab, ile); Â cout << tab << endl; Â cout << tab << " ma " << strlen(tab) << " znakow." << endl; Â delete[] tab; Â system("PAUSE"); Â return 0; }
Program się kompiluje, nie wyskakują żadne błedy. Dokładnie wygląda to tak:
Ile znakow?: (wpisuję np. 10 i daję ENTER, a dalej już program sam się wypełnia przypadkowymi wartościami)
Co?:
ma 0 znakow.
Aby kontynuować naciśnij dowolny klawisz...
A co do klastra (a nie rastra) alokacji - panie st3tc - wiem że ma 16 bajtów.
Użytkownik comp123 edytował ten post 18 czerwiec 2005, 09:25
A co do klastra (a nie rastra) alokacji - panie st3tc - wiem że ma 16 bajtów.

st3tc nie mam zamiaru się z Tobą przedżeźniać, lecz oczekuję odpowiedzi na postawiony przeze mnie wcześniej problem.
Ekchu ekchu... ja mam takie dziwne wrazenie ze odpowiedz zostala juz udzielona O_o
Jak to dopowiedź została udzielona? Czy ktoś mi podał konkretną odpowiedź? Przecież prosiłem o podanie właściwego kodu, bo ten mi nie działa.
#include <iostream> #include <string> using namespace std; int main() { char *tab; int ile; cout << "Ile znakow?: "; cin >> ile; tab = new char[ile]; cout << "Co?: "; cin.get(tab, ile); cout << tab << endl; cout << tab << " ma " << strlen(tab) << " znakow." << endl; delete[] tab; system("PAUSE"); return 0; }
Program się kompiluje, nie wyskakują żadne błedy. Dokładnie wygląda to tak:
Ile znakow?: (wpisuję np. 10 i daję ENTER, a dalej już program sam się wypełnia przypadkowymi wartościami)
Co?:
ma 0 znakow.
Aby kontynuować naciśnij dowolny klawisz...
Napiszcie konkretnie co jest źle, tak, aby wreszcie kod zadziałał.
jooz chyba wiem
daj po pierwszym cin >>... nastepujace wywolanie:
cin.ignore();
teraz powinno dzialac mi sie zdaje
1) wyglada na to ze get( *char str, int i ) wpisuje do tablicy i - 1 elementow + null na koncu ( czyli chcac wczytac rzeczywistych znakow tyle ile dostajesz odpowiedz od usera na poczatku i w alokowaniu tablicy musisz uzyc argumentu ile + 1 i w funkcji get( str, ile + 1 );
to chyba rozwiazuje twooj problem mi sie zdaje
btw nie wiem czy to jest eleganckie rozwiazanie ale u mnie to dziala ( choc moze wcale tak nie powinno sie robic... )
Użytkownik l_ahriman edytował ten post 18 czerwiec 2005, 15:08
dzięki l_ahriman, wreszcie rozwiązałeś mój problem. B) Ale jeszcze tak z ciekawości zapytam za co odpowiada metoda cin.ignore()?
Użytkownik comp123 edytował ten post 18 czerwiec 2005, 15:17
dzięki l_ahriman, wreszcie rozwiązałeś mój problem. B) Ale jeszcze tak z ciekawości zapytam za co odpowiada metoda cin.ignore()?

ignore nie czysci strumienia. on po prostu ignoruje znaki wprowadzane przez uzytkwonika az do osiagniecia n znakow, lub parametru delim. Jezeli nie podasz zadnego parametru, to n wynosi domyslnie 1, a znakiem konczacym jest EOL czyli znak nowej lini :D Zastosowanie tej metody nmie jest zlym pomyslem. Jednak do wczytywania calych zdan proponuje metode getline. Bo get z zasady kojarzony jest z wczytywamniem pojedynczego znaku.
st3tc, daj sobie spokoj, nie ma co tracic nerwow :) comp123 - a tak swoja droga, to przeczytales jakas ksiazke do konca? tzn mam na mysli podrecznik do C++ itp.
st3tc, daj sobie spokoj, nie ma co tracic nerwow comp123 - a tak swoja droga, to przeczytales jakas ksiazke do konca? tzn mam na mysli podrecznik do C++ itp.
A po co pytasz? Mistrzem programowania to ja nie jestem, a akurat problemy, na które zadaje pytania nie mogłem znaleźć w moich książkach(to chyba oczywiste, po to jest to forum).
no ok ok, mnie tu nie ma w koncu ;) w kazdym razie nie uwazam, zeby do tego wlasnie sluzylo forum :)