Witam,
czy istnieje jakaś funkcja w C, która z podanego zdania wyodrębnia słowa (separator jako spacja) i zapisuje je do tablicy? Jak to można wykonać?
jeśli masz jakieś zdanie, to sama funkcja scanf() pobiera łańcuch do momentu, w którym zostanie wykryty znak taki jak spacja, nowa linia czy tabulator, więc wystarczy pobierać kolejne wyrazy np. do tablicy do momentu, w którym zostanie wykryty znak nowej linii, jeśli podajesz dane zdanie w konsoli przy wywołaniu programu.
strtok() http://www.cplusplus.com/reference/cstring/strtok/
ale odradzam jej użycia, bo jest straszliwie wolna.
A jak już podzieliłem to zdanie, to w jaki sposób podziałać na nowej zmiennej, żeby wypisać ilość powtórzeń danego słowa?
Całość programu:
#include <stdio.h>
#include <ctype.h>
int main ()
{
char zdanie[200];
printf("Podaj zdanie: ");
gets(zdanie);
// BEGIN - ZAMIAN LITER Z WIELKICH NA MAlE
int a;
a = strlen(zdanie);
int i;
for(i=0; i<a; i++) {
if(isupper(zdanie[i])) { zdanie[i]=zdanie[i]+32; }
}
// printf("Twoje zdanie to: %s \n", zdanie);
// END - ZAMIANA LITER Z WIELKICH NA MAŁE
// BEGIN - ROZDZIELENIE ZDANIA NA SLOWA
char separator[] = " ,.-";
char * rozdzielone;
rozdzielone = strtok(zdanie, separator);
while( rozdzielone != NULL )
{
printf( "%s\n", rozdzielone );
rozdzielone = strtok( NULL, separator );
}
printf("%s", rozdzielone);
// END - ROZDZIELENIE ZDANIA NA SLOWA
}
- dodawać do mapy lub drzewa binarnego slowo -> licznik
- posortować listę słów, więc wszystkie powtórzenia będą po kolei
Ale wcześniej muszę jakoś wyliczyć ile słów jest identycznych w zdaniu? Czy zmienna "rozdzielone" z powyższego programu to tablica? Bo program faktycznie zwraca pojedynczo elementy, tylko jak się odwołać do poszczególnych elementów? Sorry, za tak banalne pytania i za to, że zaśmiecam ten dział, ale jestem totalnie zielony w C. :-(
W jaki sposób z funkcji strtok można wyciągnąć konkretne słowo?
Dartam napisał(a):
W jaki sposób z funkcji strtok można wyciągnąć konkretne słowo?
Nie da się, możesz najwyżej dodać je do jakieś listy, wektora, tablicy wskaźników.
Można prościej. Jak dzielisz zdanie zrób sobie tablice, np.
int *count; char **slowa;
W tablicy slowa będziesz po kolei umieszczał każde nowe słowo, którego jeszcze nie ma w tej tablicy. Np umieszczasz 1sze_słowo w tablicy slowo, to piszesz, że:
strcpy(slowa[index], 1sze_slowo); /*skopiuj slowo do tabelki*/
count[index] = 1;
Jeżeli dostaniesz słowo, które już istnieje w tablicy slowa, to patrzysz pod jakim indexem w tablicy jest zapisane to slowo i piszesz:
count[index]++;
Ten kod jest raczej orientacyjny, ma pokazać koncepcję programu, a nie dać Ci gotowe rozw. na tacy.
To tyle, mam nadzieję, że pomogłem ;)