# include <iostream>
# include <string>
using namespace std;
string rega(string);
string sentence, words[];
int main()
{
cout << "Napisz zdanie:" << endl;
getline(cin, sentence);
rega(sentence);
cout << words << endl;
system("pause");
}
string rega(string s)
{
int i = 0;
short cnt = 0;
for (i; i < s.size(); i++)
{
words[cnt] += s[i];
if (s[i] == ' ')
cnt++;
}
return words[cnt];
}
No i? Chciałeś się pochwalić kodem czy masz jakieś pytania w związku z nim?
piiik napisał(a):
using namespace std;
Na razie możesz. Potem Cię zjedzą za to. Uważa się, że `using namespace` to zuo.
```cpp
> string sentence, words[];
Gdzie rozmiar tablicy? To C++ nie C#
> rega(sentence);
Nazwa funkcji winna być jaśniejsza, ale to kosmetyka
> cout << words << endl;
Tak NIE wypisujesz zawartości tablicy tylko wskaźnik na pierwszy element.
...
BTW znowu to samo, nauczanie C++ na poziomie C
> system("pause");
Dalej środowiska nie umieją utrzymać konsoli otwartej? A uczniowie odpalać programów z konsoli?
> for (i; i < s.size(); i++)
int i = 0
chciałeś napisać?
> words[cnt] += s[i];
ROZMIAR. TABLICY. Nie zaalokowałeś pamięci dla swej tablicy. Jak już musisz używać tablic to rób to poprawnie.
To jest POWAŻNY błąd który na nieszczęście nie zawsze daje wyraźne rezultaty w postaci blokady kompilacji czy wywalenia programu.
> return words[cnt];
Po co return skoro z niego nie korzystasz?
#include <string>
#include <memory>
#include <sstream>
#include <iostream>
#include <iterator>
#include <algorithm>
// Skoro juz musi byc tablica...
std::unique_ptr<std::string[]> podziel_na_slowa(std::string zdanie, std::size_t &liczba_slow)
{
std::stringstream ss(zdanie);
// Jakby dopuscic std::vector zamiast tablicy to zaoszczedzilibysmy
// ponizszych 5 linijek, ktore bylyby wtedy zbedne
// std::vector naprawde upraszcza
std::string slowo;
liczba_slow = 0;
while(ss >> slowo) // zjecie mnie za brak nawiasu
liczba_slow++;
ss = std::stringstream(zdanie);
auto wyn = std::make_unique<std::string[]>(liczba_slow);
for(std::size_t i = 0; i < liczba_slow; i++)
ss >> wyn[i];
return wyn;
}
int main()
{
std::string zdanie;
getline(std::cin, zdanie);
std::size_t liczba_slow;
auto slowa = podziel_na_slowa(zdanie, liczba_slow);
std::copy(slowa.get(), slowa.get()+liczba_slow, std::ostream_iterator<std::string>(std::cout, " "));
std::cout << std::endl;
return 0;
}
Jak mi poszło?
Zapomniałem dodać komentarza, chodzi właśnie o to, że nie wiedziałem co robię źle, chcę dodać że jestem początkującym i nie mam czym się chwalić, dziękuję za dotychczasowe poprawki. :)
Jeśli użyjesz regexa nie będziesz musiał się martwić o ilość spacji.
int main() {
std::string subject("This is a test");
try {
std::regex re("\\w+");
std::sregex_iterator next(subject.begin(), subject.end(), re);
std::sregex_iterator end;
while (next != end) {
std::smatch match = *next;
std::cout << match.str() << "\n";
next++;
}
} catch (std::regex_error& e) {
// błąd w zapisie regexa
}
}
@piiik
Tak na temat Twojego zadania, to powinieneś zdecywanie przypomnieć sobie new
/ delete
, bo mam nieodparte wrażenie, że tego właśnie wymagają od Ciebie w tym zadaniu. (No chyba, że uczą Ciebie malloc
/ free
, to wtedy te dwa przypomnieć sobie).
Bez tego nie zrobisz tego zadania w ten sposób, w jaki od Ciebie oczekują.
Uczciwie trzeba przyznać, że gdy dopuścić vector
a, to to zadanie całkiem ładnie się robi i bez regexów i bez splitów:
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <iterator>
#include <algorithm>
using namespace std; // nie mam cierpliwosci pisac wszedzie std::
vector<string> podziel_na_slowa(string zdanie)
{
istringstream ss(zdanie);
return vector<string> {
istream_iterator<string>{ss},
istream_iterator<string>{}
};
}
int main()
{
string zdanie; getline(cin, zdanie);
auto slowa = podziel_na_slowa(zdanie);
copy(slowa.begin(), slowa.end(), ostream_iterator<string>(cout, " "));
cout << endl;
return 0;
}