Ĺadny brzuch
Witam,
mam mały problem, który nie idzie mi rozwiązać... gdy podstawiam pod pewien string jakikolwiek tekst bez spacji wszystko idzie dobrze... gdy spróbuję przypisać do zmiennej typu string tekst ze spacją... program wariuje... by to zaprezentować zrobiłem malutki program do zliczania znaków:
kod:
#include <iostream> #include <string> unsigned Zlicz(std::string strTekst, char cZnak) { unsigned nIlosc = 0; for (unsigned int i = 0; i <= strTekst.length() - 1; ++i) { if (strTekst[i] == cZnak) ++nIlosc; } return nIlosc; } int main() { std::string strDoZliczenia; std::cout << "Wpisz tekst w którym mają być zliczane znaki: "; std::cin >> strDoZliczenia; char chLitera; std::cout << "Wpisz znak, który ma być zliczany: "; std::cin >> chLitera; std::cout << "W tym tekście jest " << Zlicz(strDoZliczenia, chLitera) << " znaków '" << chLitera << "'"; getchar(); return 0; }
gdy wpiszę "Ala" to wtedy ładnie potem wpisuję znak "A" i mi go zlicza... lecz jak wpiszę "Ala ma kota" to program nawet nie pyta jaki znak ma sprawdzać tylko sam sobie przypisuje "m" (jako pierwsza litera po pierwszej spacji) i rozpoczyna funkcję Zlicz!
zamieniłem więc:
std::string strDoZliczenia; std::cout << "Wpisz tekst w którym mają być zliczane znaki: "; std::cin >> strDoZliczenia;
na std::string strDoZliczenia = "Ala ma kota";
i wtedy ładnie wszystko chodzi... jednak dlaczego program wariuje w pierwszej sytuacji?
Dzieje się tak, ponieważ program wczytuje stringa z klawiatury, aż napotka spację. Najprostsze rozwiązanie, to "getline".
Wskazówka: jeśli przekazujesz stringa do funkcji, to używaj referencji ("const std::string&" lub bez "const"), a "i <= strTekst.length() - 1;" możesz zastąpić "i < strTekst.length();". Mniej pisania, chyba, że jest Ci tak wygodniej :)
#include <iostream> #include <string> #include <limits> unsigned Zlicz(const std::string& strTekst, char cZnak) { unsigned nIlosc = 0; for (unsigned int i = 0; i <= strTekst.length() - 1; ++i) { if (strTekst[i] == cZnak) ++nIlosc; } return nIlosc; } int main() { char strDoZliczenia[512]; std::cout << "Wpisz tekst, w ktorym maja byc zliczane znaki: "; std::cin.getline(strDoZliczenia, 512); char chLitera; std::cout << "Wpisz znak, ktory ma byc zliczany: "; std::cin >> chLitera; std::cout << "W tym tekscie jest " << Zlicz(strDoZliczenia, chLitera) << " znakow '" << chLitera << "'"; std::cin.get(); return 0; }
Użytkownik Kozack edytował ten post 12 sierpień 2008, 11:40
dzięki,
Twoim sposobem da się to rozwiązać niemniej szukam sposobu by jeszcze przed uruchomieniem funkcji tekst znajdował się w stringu...
mimo wszystko dzięki temu co napisałeś i przy użyciu rzutowania poradziłem sobie w ten sposób:
std::string strDoZliczenia; char Tekst[512]; std::cout << "Wpisz tekst w którym mają być zliczane znaki: "; std::cin.getline(Tekst, 512); strDoZliczenia = static_cast<std::string>(Tekst);
chociaż nie wygląda to chyba najlepiej ;)
jest trudniejsze rozwiązanie?
a co do argumentu funkcji... to tak na szybko pisane, ale dzięki za spostrzeżenie :)
Użytkownik tulio edytował ten post 12 sierpień 2008, 15:47
Wcale nie musisz wczytywać zdania najpierw do tablicy. I w tym wypadku proponuję użyć std::getline zamiast istream::getline.std::string strZdanie; std::getline(std::cin, strZdanie);
A tak abstrahując od problemu to warto zapoznać się dogłębniej z STL'em#include <iostream> #include <algorithm> #include <functional> #include <string> int main() { std::string strZdanie; char cZnak; std::getline(std::cin, strZdanie); std::cin >> cZnak; unsigned c = static_cast<unsigned>( std::count_if( strZdanie.begin(), strZdanie.end(), std::bind2nd(std::equal_to<char>(),cZnak) ) ); std::cout << c << std::endl; return 0; }
Dzięki Ci! :)
strDoZliczenia = static_cast<std::string>(Tekst);[/code]
Problem już rozwiązany, ale intryguje mnie to rzutowanie. Nie możesz w takim przypadku po prostu użyć przypisania "strDoZliczenia = Tekst"?
Użytkownik Kozack edytował ten post 12 sierpień 2008, 19:40
oczywiście mogę - kwestia przyzwyczajenia... bez rzutowania mógłbym się zapomnieć, że Tekst to char, a nie string (mimo, że można użyć odpowiedniej notacji). Kod jest gorszy, ale zyskuję +1 do braku pomyłek.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
mam mały problem, który nie idzie mi rozwiązać... gdy podstawiam pod pewien string jakikolwiek tekst bez spacji wszystko idzie dobrze... gdy spróbuję przypisać do zmiennej typu string tekst ze spacją... program wariuje... by to zaprezentować zrobiłem malutki program do zliczania znaków:
kod:
#include <iostream> #include <string> unsigned Zlicz(std::string strTekst, char cZnak) { unsigned nIlosc = 0; for (unsigned int i = 0; i <= strTekst.length() - 1; ++i) { if (strTekst[i] == cZnak) ++nIlosc; } return nIlosc; } int main() { std::string strDoZliczenia; std::cout << "Wpisz tekst w którym mają być zliczane znaki: "; std::cin >> strDoZliczenia; char chLitera; std::cout << "Wpisz znak, który ma być zliczany: "; std::cin >> chLitera; std::cout << "W tym tekście jest " << Zlicz(strDoZliczenia, chLitera) << " znaków '" << chLitera << "'"; getchar(); return 0; }
gdy wpiszę "Ala" to wtedy ładnie potem wpisuję znak "A" i mi go zlicza... lecz jak wpiszę "Ala ma kota" to program nawet nie pyta jaki znak ma sprawdzać tylko sam sobie przypisuje "m" (jako pierwsza litera po pierwszej spacji) i rozpoczyna funkcję Zlicz!
zamieniłem więc:
std::string strDoZliczenia; std::cout << "Wpisz tekst w którym mają być zliczane znaki: "; std::cin >> strDoZliczenia;
na std::string strDoZliczenia = "Ala ma kota";
i wtedy ładnie wszystko chodzi... jednak dlaczego program wariuje w pierwszej sytuacji?
Dzieje się tak, ponieważ program wczytuje stringa z klawiatury, aż napotka spację. Najprostsze rozwiązanie, to "getline".
Wskazówka: jeśli przekazujesz stringa do funkcji, to używaj referencji ("const std::string&" lub bez "const"), a "i <= strTekst.length() - 1;" możesz zastąpić "i < strTekst.length();". Mniej pisania, chyba, że jest Ci tak wygodniej :)
#include <iostream> #include <string> #include <limits> unsigned Zlicz(const std::string& strTekst, char cZnak) { unsigned nIlosc = 0; for (unsigned int i = 0; i <= strTekst.length() - 1; ++i) { if (strTekst[i] == cZnak) ++nIlosc; } return nIlosc; } int main() { char strDoZliczenia[512]; std::cout << "Wpisz tekst, w ktorym maja byc zliczane znaki: "; std::cin.getline(strDoZliczenia, 512); char chLitera; std::cout << "Wpisz znak, ktory ma byc zliczany: "; std::cin >> chLitera; std::cout << "W tym tekscie jest " << Zlicz(strDoZliczenia, chLitera) << " znakow '" << chLitera << "'"; std::cin.get(); return 0; }
Użytkownik Kozack edytował ten post 12 sierpień 2008, 11:40
dzięki,
Twoim sposobem da się to rozwiązać niemniej szukam sposobu by jeszcze przed uruchomieniem funkcji tekst znajdował się w stringu...
mimo wszystko dzięki temu co napisałeś i przy użyciu rzutowania poradziłem sobie w ten sposób:
std::string strDoZliczenia; char Tekst[512]; std::cout << "Wpisz tekst w którym mają być zliczane znaki: "; std::cin.getline(Tekst, 512); strDoZliczenia = static_cast<std::string>(Tekst);
chociaż nie wygląda to chyba najlepiej ;)
jest trudniejsze rozwiązanie?
a co do argumentu funkcji... to tak na szybko pisane, ale dzięki za spostrzeżenie :)
Użytkownik tulio edytował ten post 12 sierpień 2008, 15:47
Wcale nie musisz wczytywać zdania najpierw do tablicy. I w tym wypadku proponuję użyć std::getline zamiast istream::getline.std::string strZdanie; std::getline(std::cin, strZdanie);
A tak abstrahując od problemu to warto zapoznać się dogłębniej z STL'em#include <iostream> #include <algorithm> #include <functional> #include <string> int main() { std::string strZdanie; char cZnak; std::getline(std::cin, strZdanie); std::cin >> cZnak; unsigned c = static_cast<unsigned>( std::count_if( strZdanie.begin(), strZdanie.end(), std::bind2nd(std::equal_to<char>(),cZnak) ) ); std::cout << c << std::endl; return 0; }
Dzięki Ci! :)
strDoZliczenia = static_cast<std::string>(Tekst);[/code]
Problem już rozwiązany, ale intryguje mnie to rzutowanie. Nie możesz w takim przypadku po prostu użyć przypisania "strDoZliczenia = Tekst"?
Użytkownik Kozack edytował ten post 12 sierpień 2008, 19:40
oczywiście mogę - kwestia przyzwyczajenia... bez rzutowania mógłbym się zapomnieć, że Tekst to char, a nie string (mimo, że można użyć odpowiedniej notacji). Kod jest gorszy, ale zyskuję +1 do braku pomyłek.