Oddzielanie słów w stringu i przypisywanie ich do tablicy

1
# 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];
}
0

No i? Chciałeś się pochwalić kodem czy masz jakieś pytania w związku z nim?

1
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?

1
#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?

2

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. :)

0

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
  }
}
1

@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ą.

@gośćabc @several

Uczciwie trzeba przyznać, że gdy dopuścić vectora, 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;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1