znaki
Transkrypt
znaki
Znaki, tablice znakowe W języku C do pamiętania znaków przeznaczony jest typ char (charakter). Zmienna typu char zajmuje 1 bajt w pamięci. Ponadto każdemu znakowi odpowiada jego kod ASCII, który jest liczbą całkowitą (int). Stałe znakowe zapisywane są między znakami pojedynczego cudzysłowia (np. ‘a’, ‘A’), natomiast do zapisu stałych tekstowych (ciągu znaków) używa się symboli: ” (np. ”stala tekstowa”). Na końcu tekstu kompilator dodaje znak końca tekstu – jest to znak o kodzie 0, który jest zapisywany ‘\0’. Tekst, czyli ciąg znaków (string) zapisywany jest w pamięci komputera w tablicy typu char. Kod znaku a znak Poniższy program wyświetla wprowadzone z klawiatury znaki i ich kody ASCI. Zastosowano funkcję getchar do wczytywania 1 znaku z klawiatury. Znak jest wyświetlany na ekranie za pomocą specyfikacji %c stosowanej dla znaków oraz %d. Warunkiem stopu jest wprowadzenie spacji (‘ ‘) o kodzie ASCII 32. #include <stdio.h> main() { int wybor; do { wybor=getchar(); printf("%d %c\n",wybor,wybor); } while (wybor!=32); // do spacji } Używając powyższego programu można zauważyć, że kody małych i dużych liter różnią się o wartość 32, co odpowiada cyfrze 1 na 6 bicie od prawej strony (26=32). Małe litery a duże litery Kolejny program pokazuje kilka sposobów zamiany liter małych na duże i odwrotnie przy zastosowaniu operatorów matematycznych ( -, + ) oraz bitowych operatorów logicznych ( |, & ): #include <stdio.h> #include <stdlib.h> int main() { //zamiana malych liter na duze i z powrotem unsigned i,j,maska; i=97; printf("i=%d i=%c\n",i,i); i=i-32; printf("i=%d i=%c\n",i,i); // maska 0000000000100000 maska=32; i=i | maska; printf("i=%d i=%c\n",i,i); maska=~maska; //maska 1111111111011111 printf("maska=%d\n",maska); i=i & maska; printf("i=%d i=%c\n",i,i); } Przykład – zliczanie słów w tekście Do ilustracji tablic tekstowych przedstawiony zostanie program, który wczytuje dowolny tekst i zlicza występujące w nim słowa. Do zliczania słów zostaną wykorzystane dwie nieznacznie różniące się funkcje. Kolejne słowo w tekście rozpoznawane jest po tym, że występuje przed nim przynajmniej jedna spacja. #include <stdio.h> #include <stdlib.h> #define MAX 150 int licz_slowa_2(text) char *text; { char znak=' ',poprz; int l=0; while(poprz=znak,znak=*text++) if(znak!=' ' && poprz==' ')l++; return l; } int licz_slowa_1(text) char *text; { char znak, poprz=' '; int i=0,j=0; while((znak=text[i++])!='\0') { if(znak!=' ' && poprz==' ')j++; poprz=znak; } return j; } int main() { int slowa; char tekst[MAX],*wtekst; //wtekst=gets(tekst); wtekst=fgets(tekst,20,stdin); printf("%s\n",tekst); printf("%s\n",wtekst); slowa=licz_slowa_1(wtekst); printf(" slow: %d\n slow: %d\n",slowa,licz_slowa_2(tekst)); } Do wczytania tablicy tekstowej zastosowano funkcję fgets. Pierwszym aktualnym parametrem jest nazwa tablicy, drugi parametr określa liczbę znaków do wczytania, a trzeci wskazuje plik, z którego ma odbywać się czytanie - w tym przypadku jest to standardowe wejście, czyli klawiatura (stdin). Funkcja fgets zwraca wskaźnik do przeczytanego tekstu, czyli adres zerowego elementu tablicy. Funkcja fgets dodatkowo dodaje na koniec tablicy znak końca linii (o kodzie 10), a po nim znak końca tekstu (\0). Rozmiar zadeklarowanej tablicy powinien być zatem dłuższy od wczytywanego tekstu o minimum dwa znaki. Alternatywnym rozwiązaniem jest zastosowanie funkcji gets (linia zakomentarzowana w programie), jednak ze względu na bezpieczeństwo systemu funkcji tej nie powinno się stosować. Na uwagę zasługuje konstrukcja: znak=*text++ występującą w funkcji licz_slowa_2. Do zmiennej znak podstawiany jest jeden bajt spod adresu wskazywanego przez zmienną text, a następnie zmienna ta jest inkrementowana, co oznacza, że będzie ona wskazywać na kolejny bajt. W alternatywnej funkcji licz_slowa_1 zastosowano konstrukcję: znak=text[i++] - do zmiennej znak podstawiany jest i-ty element tablicy (text[i]), a następnie indeks i jest zwiększany o 1.