ďťż

Ł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
  •