Zliczanie zapełnionych pól tablicy

Zliczanie zapełnionych pól tablicy
TS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Witam! Mam powiedzmy tablicę char t[20], a w niej jakieś słowo. Teraz pytanie: Jak mam się dowiedzieć ile to słowo zajmuje miejsc w tablicy?

AF
  • Rejestracja: dni
  • Ostatnio: dni
0

Zazwyczaj po ostatnim znaku jest znak zerowy ('\0'), można go znaleźć ręcznie, albo funkcją strlen. A jeżeli nie ma tego znaku lub innego delimitera, to jest większy problem.

TS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0
Afish napisał(a)

Zazwyczaj po ostatnim znaku jest znak zerowy ('\0'), można go znaleźć ręcznie, albo funkcją strlen. A jeżeli nie ma tego znaku lub innego delimitera, to jest większy problem.

Gdyby to było takie proste to bym tutaj nie pisał :p
Btw. Strlen dla tablicy 15 elementowej zwraca 27

VA
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
int i;
for(i=0; t[i]!='\0'; i++);

jak ci sie ta petla skonczy to w i masz ilosc znakow od pierwsszego elementu tablicy t do '\0' (nie liczac '\0') czyli dostajesz długość zdania

i konieczne jest tu aby licznik petli byl poza trescia petli (dlatego jest int i; for(...) a nie for(int i...) )

MX
  • Rejestracja: dni
  • Ostatnio: dni
0

Tylko że strlen() działa właśnie na tej metodzie, którą przedstawił @up - wobec tego jeśli strlen() nie zadziała, Twój kod też nie zadziała :/.
Co do pytania - najwyraźniej albo musisz zacząć kończyć swoją tablicę charów znakiem '\0' lub po prostu gdzieś przechowywać długość ciągu.

TS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0
Valdemart napisał(a)
Kopiuj
int i;
for(i=0; t[i]!='\0'; i++);

jak ci sie ta petla skonczy to w i masz ilosc znakow od pierwsszego elementu tablicy t do '\0' (nie liczac '\0') czyli dostajesz długość zdania

i konieczne jest tu aby licznik petli byl poza trescia petli (dlatego jest int i; for(...) a nie for(int i...) )

skoro strlen to i to nie zadziała

VA
  • Rejestracja: dni
  • Ostatnio: dni
0

no to inny pomysł

skoro mówisz że w tablicy masz jakieś "słowo" to nie rozpoznawaj znaku konca łancucha tylko znak inny niz litera
przeciez słowa nie zawierają spacji ani cyfr ani znakow niedrukowalnych...

wtedy z t[i]!='\0 robi sie ((t[i]>='a')&&(t[i]<='z'))||((t[i]>='A')&&(t[i]<='Z'))

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

O czym wy w ogóle mówicie? Przecież w tablicy za tym "słowem" mogą być znaki które są literkami a do słowa nie nalezą. Odpowiedź jest prosta: nie da sie okreslić gdzie się to słowo kończy jeśli sam tego w jakis sposób nie oznaczysz (albo dając delimiter albo zapisujac jego długość).

KU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 166
0

Jeśli z jakiegoś powodu nie możesz kończyć ciągu znakiem NULL, to w takim razie musisz zliczać zapisy i usunięcia z tablicy, albo po zaalokowaniu zeruj ją i ogranicznikiem z automatu będzie NULL:

Kopiuj
char		tab[20];
memset(tab, '\0', 20);

Po tym strlen() zadziała prawidłowo o ile długość ciągu (bez końcowego NULLa) będzie mniejsza niż 20.
Tablice w C nie przechowują danych o wielkości czy ilości "zajętego miejsca". Są to tylko obszary w pamięci i sam musisz zadbać o zarządzanie nimi. W przypadku łańcuchów znaków ich koniec oznacza się wstawieniem znaku '\0' i jest to jedyny sposób na stwierdzenie ich długości (tak działa strlen()).

rincewind
  • Rejestracja: dni
  • Ostatnio: dni
0

Przy braku jakichkolwiek delimiterów, jedynym rozwiązaniem jest stworzenie słownika (np. http://en.wikipedia.org/wiki/Trie ) i znajdowanie według niego największego prefiksu w tablicy. :P

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.