bybue1 Temat założony przez niniejszego użytkownika |
strcmp() i petla x? » 2014-04-28 14:24:41 Witam, robie zadania z ksiazki o c++ i zatrzymalem sie na zadaniu o tresci: "Napisz program korzystjacy z tablicy char, odczytujacy w petli slowo po slowie az do wypisania "gotowe". Nastepnie program powienien pokazywac liczbe podanych slow (poza gotowe). Przy porownaniach uzyj funkcji strcmp() i pliku naglowkowego cstring." a oto moj nic nie warty kod: #include <iostream> #include <cstring>
using namespace std;
int main() { cout << "Podawaj slowa (kiedy skonczysz, napisz \"gotowe\")\n"; char tekst[ 100 ]; int ilosc = 0; cin.get( tekst, 100 ); while( tekst != "gotowe" ) { cin.get( tekst, 100 ); } cout << "Podano " << ilosc << " slow."; system( "pause" ); return 0; }
1 Nie wiem jaka petle uzyc 2 Nie wiem jak zliczyc ilosc wyrazow (znaki jeszcze jakos potrafilbym). Prosze o jakies wskazowki. |
|
RazzorFlame |
» 2014-04-28 14:52:58 Źle to zrobiłeś, wczytujesz za każdym razem słowo do tego samego bufora czyli tracisz poprzednie dane. Zrób w ten sposób: std::vector < char *> wyrazy; char * wczytany = ""; while( wczytany != "gotowe" ) { std::cin.get( wczytany, 100 ); wyrazy.push_back( wczytany ); } std::cout << "Ilosc: " << wyrazy.size() << std::endl;
|
|
bybue1 Temat założony przez niniejszego użytkownika |
» 2014-04-28 15:19:43 Dzieki za pomoc ale z tego co napisales to to nie dziala do konca. #include <iostream> #include <cstring> #include <vector>
using namespace std;
int main() { cout << "Podawaj slowa (kiedy skonczysz, napisz \"gotowe\")\n"; vector < char *> wyrazy; char * wczytany = ""; while( wczytany != "gotowe" ) { cin.get( wczytany, 100 ); wyrazy.push_back( wczytany ); } cout << "Ilosc: " << wyrazy.size() << endl; system( "pause" ); return 0; }
I nie wiec co robi push_back. Czy potrafilbys zrobic uzywajac strcmp, tak jak w poleceniu? |
|
RazzorFlame |
» 2014-04-28 16:46:51 Jak "nie działa do końca"? Strcmp porównuje dwie tablice znaków... w pętli zamień warunek na "strcmp(wczytany, "gotowe") != 0" Push back dodaje na koniec vectora żądany obiekt |
|
pekfos |
» 2014-04-28 17:42:35 Zrób w ten sposób:
std::vector < char *> wyrazy; char * wczytany = ""; while( wczytany != "gotowe" ) { std::cin.get( wczytany, 100 ); wyrazy.push_back( wczytany ); } std::cout << "Ilosc: " << wyrazy.size() << std::endl;
|
Żartujesz..? |
|
RazzorFlame |
» 2014-04-28 19:24:17 |
|
bybue1 Temat założony przez niniejszego użytkownika |
» 2014-04-28 20:50:45 Dla pelnej klarownosci dodam jeszcze raz kod/ #include <iostream> #include <cstring> #include <vector>
using namespace std;
int main() { cout << "Podawaj slowa (kiedy skonczysz, napisz \"gotowe\")\n"; vector < char *> wyrazy; char * wczytany = ""; while( strcmp( wczytany, "gotowe" ) != 0 ) { cin.get( wczytany, 100 ); wyrazy.push_back( wczytany ); } cout << "Ilosc: " << wyrazy.size() << endl; system( "pause" ); return 0; }
podczas kompilacji pojawia sie warning: 11 20[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings] co powoduje krasz aplikacji za kazdym wlaczeniu po wpisaniu czegokolwiek i zatwierdzeniem <enter>. Nie dziala? |
|
pekfos |
» 2014-04-29 10:37:54 cin.get( wczytany, 100 );
|
Heh, a gdzie ty to próbujesz zapisać? I skąd te 100? wczytany wskazuje na stałą (błąd) tablicę, do której próbujesz zapisać (UB) tekst. Do tego ta tablica ma 1 element, a nie 100 (UB). Powinno to wyglądać tak: Dalej: std::vector<> to znacznie więcej zachodu niż potrzeba, o ile nie użyjesz std::string. Z char*, push_back() nie skopiuje stringa - po prostu będziesz cały czas dodawać ten sam adres, pod którym będzie ostatni wczytany tekst. Musiałbyś za każdym dodaniem alokować pamięć, kopiować łańcuch, a na koniec programu wypadałoby jeszcze zwolnić całą pamięć. Do tego, zadanie mówi tylko o ilości słów, a nie o wypisywaniu słów, czy coś takiego. Wystarczy zwykły int.. |
|
« 1 » |