Laboratorium 6: Ciągi znaków. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Podobne dokumenty
Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

. Podstawy Programowania 1. Łańcuchy znaków. Arkadiusz Chrobot. 25 listopada 2015

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 9 - sem.iii. Dr inż. M. Czyżak

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 7- sem.iii. M. Czyżak

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

ŁAŃCUCHY W JĘZYKU C/C++

Pliki. Informacje ogólne. Obsługa plików w języku C

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

Inicjacja tablicy jednowymiarowej

Podstawy programowania w języku C++

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

1. Wprowadzanie danych z klawiatury funkcja scanf

Tablice deklaracja, reprezentacja wewnętrzna

Pliki. Informacje ogólne. Obsługa plików w języku C

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Podstawy programowania

Języki programowania obiektowego Nieobiektowe elementy języka C++

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Podstawy programowania 1

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

INFORMATYKA Studia Niestacjonarne Elektrotechnika

lekcja 8a Gry komputerowe MasterMind

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 11. Elektrotechnika, semestr II rok akademicki 2008/2009

Podstawy Programowania

KURS C/C++ WYKŁAD 1. Pierwszy program

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Programowanie w językach wysokiego poziomu

Reprezentacja symboli w komputerze. Znaki alfabetu i łańcuchy znakowe. Programowanie Proceduralne 1

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Spis treści JĘZYK C - ŁAŃCUCHY ZNAKÓW. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF22

Wskaźniki w C. Anna Gogolińska

Operacje na łańcuchach znaków

Stałe i zmienne znakowe. Stała znakowa: znak

2 Przygotował: mgr inż. Maciej Lasota

Spis treści JĘZYK C - ŁAŃCUCHY ZNAKÓW. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF10Z

Zasady programowania Dokumentacja

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Wykład 6. Operacje na łańcuchach znakowych

Wstęp. #define include include include include include include

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Języki i metodyka programowania. Wprowadzenie do języka C

dr inż. Jarosław Forenc

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Podstawy Programowania Podstawowa składnia języka C++

Wykład 2 Składnia języka C# (cz. 1)

PODSTAW PROGRAMOWANIA WYKŁAD 7 ŁAŃCUCHY

Wstęp do Programowania, laboratorium 02

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie Proceduralne

Biblioteka standardowa - operacje wejścia/wyjścia

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Reprezentacja symboli w komputerze.

Programowanie strukturalne i obiektowe

Podstawy programowania w języku C++

7 Przygotował: mgr inż. Maciej Lasota

Tablice, funkcje - wprowadzenie

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Programowanie w C Typ wskaźnikowy do typu znakowego i operacje na łańcuchach

Wprowadzenie do programowania w języku C

Program wykonujący operację na plikach powinien zachować schemat działania zapewniający poprawną pracę:

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Laboratorium 2: Pętle i instrukcje warunkowe. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Plik jest reprezentowany przez strumień znaków (bajtów) o zmiennej długości. Koniec strumienia identyfikowany jest znacznikiem końca pliku EOF.

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Wstęp do programowania

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Tablice wielowymiarowe. Przykład tablica 2-wymiarowa. Przykład. Przykład 3-wymiarowy. Tak naprawdę nie istnieją w C! Rozważmy tablicę o rozmiarze 3x2

Wstęp do wskaźników w języku ANSI C

Reprezentacja symboli w komputerze.

Lab 9 Podstawy Programowania

Temat zajęć: Filtry, strumienie standardowe oraz przetwarzanie potokowe. stderr

Metodyki i Techniki Programowania MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

tablica: dane_liczbowe

KURS C/C++ WYKŁAD 2. char znak; znak = a ; Program 2 #include<stdio.h> void main() { char znak; while( (znak = getchar() )!= t ) putchar(znak); }

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

Wstęp do programowania. Wykład 1

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Część 4 życie programu

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Laboratorium Podstaw Informatyki Strona 1. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 2. Funkcje, operatory i wyrażenia.

Transkrypt:

Laboratorium 6: Ciągi znaków mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski 17 listopada 2016

1. Wprowadzenie Instrukcja poświęcona jest zmiennym, które służą do przechowywania łańcuchów znaków w tym języku. Jej drugi rozdział traktuje o funkcjach umożliwiających wykonywanie operacji na tych łańcuchach. 2. Łańcuchy znaków Język c nie posiada osobnego typu o nazwie string. Zamiast tego pozwala on przechowywać ciągi (łańcuchy) znaków w tablicach elementów typu char. Należy pamiętać, że taka tablica musi mieć o jeden element więcej niż jest znaków w łańcuchu, który chcemy w niej przechować. Dodatkowe miejsce jest potrzebne do zapamiętania znaku o kodzie ascii 1 równym zero, zapisywanym w języku c jako '\0', który oznacza koniec ciągu znaków. Takie tablice mogą być tworzone jako tablice zainicjowane. Listing 1 zawiera kilka przykładów. char ciag[] = {'P','r','z','y','k','ł','a','d','\0'}; char ciag1[] = "Przykład"; // Tekst podany w cudzysłowie jest traktowany jako // łańcuch znaków i nie wymaga podawania znaku // końca ciągu. char ciag2[10]; // Niezainicjowana tablica znaków, która może pomieścić łańcuchy // o długości maksymalnie dziewięciu znaków. 2.1. Operacje na łańcuchach Listing 1: Tablice znaków Tablice w języku c są zrealizowane jako wskaźniki na obszary pamięci mogące pomieścić określoną liczbę elementów danego typu. W tej instrukcji ta cecha tablic nie będzie głębiej analizowana, jednakże ma ona pewne konsekwencje, które są szczególnie widoczne w przypadku tablic znaków. Do każdego elementu takiej tablic możemy dostać się tak samo jak do elementu w zwykłej tablicy, ale nie możemy bezpośrednio, za pomocą operator = przypisać jednej tablicy do drugiej lub porównywać ich za pomocą operatora == 2. Standardowa biblioteka języka c dostarcza funkcji, które umożliwiają wykonanie takich operacji. Zacznijmy jednak od wczytania ciągu znaków z klawiatury i wypisania go na ekran. Możemy wydrukować łańcuch znaków na ekranie za pomocą funkcji puts() lub printf(). Listing 2 zawiera trzy przykłady. puts("ala ma kota."); printf("ala ma kota.\n"); char ciag[] = "Ala ma kota."; puts(ciag); printf("%s\n",ciag); Listing 2: Wypisanie łańcucha znaków na ekran W funkcji printf() do wypisania zawartości zmiennej będącej tablicą znaków został użyty ciąg formatujący %s. Tego samego ciągu można użyć do wprowadzania łańcucha z klawiatury przy pomocy funkcji scanf(), ale tak użyta funkcja scanf() będzie wczytywała ciąg do napotkania pierwszego znaku białego (np. w przypadku ciągu Ala ma kota. wczyta tylko Ala ). Aby wczytać cały ciąg, należy użyć wyrażeń regularnych i przekazać funkcji, że ma czytać wszystkie znaki oprócz znaku końca wiersza ( \n ), który generowany jest przez klawisz Enter. Można też użyć w tym celu funkcji fgets() 3. Przyjmuje ona trzy argumenty wywołania: tablicę znaków, maksymalny rozmiar wprowadzanego łańcucha oraz zmienną 1 Język c umożliwia również stosowanie standardów utf, ale ten temat nie będzie tu opisywany. 2 Dokładniej rzecz ujmując, można za pomocą tego operatora porównywać jedynie adresy takich tablic, ale nie ich zawartość. 3 Dostępna jest także funkcja gets(), ale jej użycie nie jest zalecane. 1

stdin będącą strumieniem standardowego wejścia, czyli połączeniem z klawiaturą. Listing 3 zawiera odpowiednie przykłady. char str[40]; scanf("%s",str); // Wczytanie ciągu do pierwszego napotkanego znaku białego. while(getchar()!='\n'); // Usunięcie znaku \n ze strumienia wejściowego. scanf("%[^\n]s",str); // Wczytanie całego ciągu znaków. while(getchar()!='\n'); // Usunięcie znaku \n ze strumienia wejściowego. fgets(str,40,stdin); // Wczytanie całego ciągu znaków. Listing 3: Wprowadzanie ciągu znaków z klawiatury Należy zauważyć, że w funkcji scanf() drugi argument (zmienna string) nie jest poprzedzona operatorem, który zwraca jej adres (znak &). Dzieje się tak, ponieważ jako drugi argument wywołania ta funkcja przyjmuje adres zmiennej do której ma zapisać wartość, a ponieważ nazwa tablicy sama w sobie jest wskaźnikiem, który zawiera taki adres, więc nie należy używać operatora & w stosunku do niej. Zapis [^\n] informuje funkcję scanf(), że ma akceptować wszystkie znaki poza znakiem nowego wiersza. W nawiasach kwadratowych umieszczany jest zbiór znaków, które mają być zaakceptowane, a znak ^ oznacza wszystkie, oprócz. Użyta w przykładzie funkcja getchar() odczytuje z klawiatury pojedynczy znak i zwraca jego kod ascii po zamianie na liczbę typu int. Funkcje wykonujące inne operacje na łańcuchach znaków dostępne są po włączeniu do programu pliku nagłówkowego strings.h lub string.h. Tabela 1 zawiera wykaz kilku z najczęściej używanych. Używając funkcji, które modyfikują zawartość zmiennych (np. dodają do ciągu nowe znaki lub kopiują ciągi znaków) należy pamiętać, że nie sprawdzają one pojemności zmiennych do których zmodyfikowane ciągi są zapisywane. Trzeba być ostrożnym, aby nie zapisywać danych poza zmienną. Przykład użycia int dl = strlen(str); int cmp = strcmp(str1,str1); int cmp = strncmp(str1,str2,n); strcpy(str1,str2); strncpy(str1,str2,n); strcat(str1,str2); strncat(str1,str2,n); Opis działania Zwraca długość ciągu znaków zapisanego w zmiennej przekazanej jej przez parametr. Nie uwzględnia znaku końca ciągu, czyli '\0'. Porównuje dwa łańcuchy znaków. Może być używana w instrukcjach warunkowych i pętlach while oraz do while. Zwraca wartość zero jeśli łańcuchy są identyczne, wartość mniejszą od zera, jeśli łańcuch pierwszy jest mniejszy od drugiego, lub dodatnią jeśli jest odwrotnie. Jak wyżej, ale porównuje tylko n pierwszych znaków. Z tego względu jest uważana za bezpieczniejszą w użyciu niż strcmp(). Kopiuje łańcuch będący drugim argumentem jej wywołania do zmiennej będącej pierwszym argumentem wywołania. Zmienna ta powinna być wystarczająco pojemna, żeby pomieścić cały łańcuch wraz ze znakiem końca. Funkcja zwraca wskaźnik do skopiowanego łańcucha, ale najczęściej ta wartość jest ignorowana. Jak wyżej, ale ogranicza kopiowanie do n początkowych znaków. Dołącza do łańcucha zapisanego w pierwszym argumencie wywołania łańcuch z drugiego argumentu. Jak wyżej, ale ogranicza się do n znaków drugiego łańcucha. Tabela 1: Wybrane funkcje z pliku string.h 2

2.2. Przykłady innych funkcji operujących na ciągach 2.2.1. atoi() #include <stdlib.h> int atoi(const char *nptr); Listing 4: Prototyp funkcji atoi() Funkcja atoi() konwertuje pierwszą liczbę zapisaną w ciągu na wartość typu int. Parametr nptr Wartość zwracana Opis Ciąg zawierający liczbę do konwersji. Liczba odczytana z ciągu i podana jako wartość typu int. Tabela 2: Parametry funkcji atoi() 2.2.2. strstr() #include <string.h> char *strstr(const char *haystack, const char *needle); Listing 5: Prototyp funkcji strstr() Funkcja strstr() znajduje pierwsze wystąpienie podciągu needle w ciągu haystack. Zerowe bajty kończące ciągi ( \0 ) nie są porównywane. Parametr haystack needle Wartość zwracana Opis Ciąg, w którym wyszukiwany jest podciąg. Podciąg, który jest poszukiwany. Funkcja zwraca wskaźnik do miejsca, gdzie znajduje się pierwsza litera pierwszego wystąpienia szukanego podciągu. Jeżeli podciąg nie zostanie znaleziony, wówczas zwracana jest wartość NULL. Tabela 3: Parametry funkcji strstr() 2.2.3. strtok() #include <string.h> char *strtok(char *str, const char *delim); Listing 6: Prototyp funkcji strtok() Funkcja strtok() zamienia pojedynczy ciąg na sekwencję niepustych podciągów, zwanych tokenami. W pierwszym parametrze funkcji podajemy ciąg do podziału. Jeżeli chcemy uzyskać kolejny token z tego samego ciągu, w parametrze tym musimy podać wartość NULL. Drugim parametrem jest lista znaków, które dzielą pierwszy ciąg na tokeny. 3

UWAGA! Funkcja używa zmiennej statycznej, dlatego nie jest bezpieczna, jeżeli jest ona używana w różnych częściach programu równocześnie. W takiej sytuacji wynik działania programu może być niezgodny z oczekiwaniami. Parametr str delim Wartość zwracana Opis Ciąg do podziału na tokeny. Podajemy tylko przy pierwszym wywołaniu funkcji dla danego ciągu. Jeżeli chcemy uzyskać kolejny token z tego samego ciągu, przez ten parametr należy przekazać wartość NULL. Tablica znaków dzielących ciąg z parametru pierwszego na tokeny. Zwraca wskaźnik na następny token lub NULL jeżeli nie ma więcej tokenów. Tabela 4: Parametry funkcji strtok() #include <string.h> #include <stdio.h> int main() { char ciag[] = "Tekst do podzialu na slowa (nie znaki). Np: Ala ma - kota i psa"; char znaki_podzialu[] = ".-:()"; char * token; printf( "Podzial tekstu \"%s\" na pojedyncze wyrazy:\n", ciag ); token = strtok( ciag, znaki_podzialu ); while( token!= NULL ) { printf( "%s\n", token ); token = strtok( NULL, znaki_podzialu ); } return 0; } Wynik działania programu: Listing 7: Przykład użycia funkcji strtok() Podzial tekstu "Tekst do podzialu na slowa (nie znaki). Np: Ala ma - kota i psa" na pojedyncze wyrazy: Tekst do podzialu na slowa nie znaki Np Ala ma kota i psa 4

3. Zadania Wszystkie programy należy napisać z podziałem na funkcje z parametrami! 1. Napisz program, który sprawdzi, czy podane przez użytkownika słowo jest palindromem. 2. Napisz program, który sprawdzi, czy podane przez użytkownika dwa słowa są anagramami. 3. Napisz program, który pozwoli wprowadzić użytkownikowi liczbę rzeczywistą z przecinkiem zamiast kropki, zwiększy jej wartość o 0,001, a następnie wypisze wynik na ekranie również z przecinkiem. Dokonaj odpowiednich konwersji w osobnych funkcjach. 4. Napisz program, który odwróci kolejność wyrazów w zdaniu wprowadzonym przez użytkownika. 5. Napisz program, który znajdzie wszystkie wystąpienia określonego wzorca w zadanym ciągu i zastąpi je innym ciągiem. Wzorzec, ciąg wstawiany oraz ciąg przeszukiwany będą podawane przez użytkownika. 6. Napisz program, który pobierze od użytkownika adres url, wypisze go na ekran, a w osobnym wierszu poda identyfikator protokołu z tego adresu, o ile został on w nim podany. 5