Wyklad 8 napisy


Podstawy programowania. Wykład 8  napisy
Małgorzata Nalbach-Moszyńska
9 Napisy w stylu C (łańcuchy) .............................................................................................. 2
9.1 Czytanie napisów......................................................................................................... 3
9.2 Czytanie wierszami  gets() i fgets() ........................................................................... 4
9.3 Funkcje operujące na napisach .................................................................................... 5
1
Podstawy programowania. Wykład 8  napisy
Małgorzata Nalbach-Moszyńska
9 Napisy w stylu C (łańcuchy)
Napis (łańcuch)  ciąg znaków przechowywany w kolejnych bajtach pamięci i
zakończony znakiem '\0'.
Zajmiemy się łańcuchami w stylu C.
Stałe:
"napis",
reprezentacja w pamięci komputera:
n a p i s '\0'
Zmienne:
Deklaracja jako tablica typu char.
char nap[6] = "napis";
char nap[] = "napis"; /* kompilator sam wylicza wielkość na 6 */
char nap[6] = { 'n','a','p','i','s','\0'};
Maksymalna długość napisu przechowywanego w tablicy o długości N to N-1 !
Przykład 1
/* w8p1.cpp -- zapis lancuchow w tablicy */
#include
int strlen (char napis[]){
/* oblicza dlugosc napisu; */
int len = 0;
int i;
for (i = 0; napis[i]!='\0'; ++i) ++len;
return len;
}
int main()
{
const int Size = 15;
char name1[Size]; /* pusta tablica */
char name2[] = "C Szkola programowania"; /* tablica
zainicjowana */
/* UWAGA: w niektórych implementacjach, aby zainicjować
tablicę name2, konieczne moze byc uzycie słowa
kluczowego static */
2
Podstawy programowania. Wykład 8  napisy
Małgorzata Nalbach-Moszyńska
printf( "Czesc! Jestem %s!" , name2);
printf( " A jak ty sie nazywasz?\n");
scanf("%s", name1);
printf( "No tak, %s, Twoje imie ma %d liter i jest
zapisane\n",
name1, strlen(name1));
printf( "w tablicy majacej %d bajtow.\n", sizeof(name1));
/* sizeof podaje dl. całej tablicy */
printf( "Twoj inicjal to %c.\n", name1[0]);
name2[3] = '\0'; /* znak NUL - konczy napis */
printf( "Pierwsze trzy znaki tytulu ksiazki to: %s\n",
name2 );
return 0;
}
9.1 Czytanie napisów
Przykład 2
/* w8p2.c -- odczyt wiecej niz jednego lancucha */
#include
#include /* prototypy funkcji do napisów */
int main()
{
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
printf("Jak sie nazywasz? ");
scanf("%s", name);
printf("Twoje imie ma %d liter.\n", strlen(name));
printf("Podaj nazwe swojego ulubionego deseru: " );
scanf("%s",dessert);
printf("\nMam dla Ciebie %s", dessert);
printf(", %s.\n", name);
return 0;
}
Instrukcja
scanf("%s", name);
czyta napis do pierwszej spacji (ogólniej blank character).
Nie da się jedną instrukcją przeczytać kilku wyrazów!
3
Podstawy programowania. Wykład 8  napisy
Małgorzata Nalbach-Moszyńska
Funkcja isblank zwraca wartość !=0, gdy argument jest znakiem typu blank i 0 w
przeciwnym przypadku.
#include /* isblank */
int isblank(int znak);
Co się stanie, jeśli wyraz na wejściu będzie dłuższy niż tablica?
9.2 Czytanie wierszami  gets() i fgets()
Składnia
char *gets();
Działanie:
Znaki z wejścia umieszcza w tablicy . Kończy z końcem wiersza. Na końcu
wstawia znak '\0 ' (usuwa znak nowego wiersza '\n ').
Zwraca wskaznik do tablicy lub NULL w przypadku błędu lub EOF.
Trzeba zadbać o to by tablica miała odpowiednią wielkość. Funkcja nie wykrywa
przekroczenia długości tablicy.
Składnia
fgets(, , );
Działanie:
Znaki z wejścia umieszcza w tablicy . Kończy z końcem wiersza lub z
przeczytaniem -1 znaków. Na końcu wstawia znak '\0 '.
Niestety nie usuwa znaku końca wiersza '\n '.
/* w8p3.cpp -- wczytanie za pomocą gets nie tylko pojedynczych
słów */
#include
int main()
{
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
printf("Podaj swoje imie i nazwisko: ");
gets(name); /* wczytuje dane do znaku nowego wiersza */
printf("Podaj swoj ulubiony deser: ");
gets(dessert);
printf("Mam dla ciebie %s", dessert);
printf(", %s.\n", name);
return 0;
}
4
Podstawy programowania. Wykład 8  napisy
Małgorzata Nalbach-Moszyńska
9.3 Funkcje operujące na napisach
Istnieją bibliotece
Jak są zaimplementowane?
#include
int strlen (char *napis){
/* oblicza dlugosc napisu bez końcowego 0*/
int len = 0;
for (; *napis++!='\0'; ) ++len;
return len;
}
char *strcpy (char *nap1, char *nap2){
/*kopiuje nap2 do nap1; wynik w nap1. NIE REZERWUJE PAMIECI!
*/
char *pom = nap1;
int dl = strlen(nap2);
int i;
for(i = 1; i<= dl+1; ++i) {
*nap1++ = *nap2++;
printf( "i = %d, nap1 = <<%s>>, nap2 = <<%s>>\n", i, pom,
nap2);
/* wydruk kontrolny, żeby mieć pewność, co się dzieje */
}
return pom;
}
char *strcat (char *nap1, char *nap2){
/* umieszcza w nap1 konkatenację nap1 z nap2; wynik w nap1.
NIE REZERWUJE PAMIECI! */
/* nap1 musi mieć dostatecznie dużo miejsca! */
char *pom = nap1;
char *pom2 = nap2;
while (*pom++ != '\0'); /* teraz pom wskazuje na 0 */
while (*pom2 != '\0' ) *pom++ = *pom2++;
*pom = '\0';
printf("nap1==%s, nap2 == %s\n",nap1, nap2);
return nap1;
5
Podstawy programowania. Wykład 8  napisy
Małgorzata Nalbach-Moszyńska
}
int main()
{
char imie[20] = "Janek";
char imie2[20];
printf("*******test strlen \n");
printf("liczba znakow: %d\n", strlen(imie));
printf("*******test strcpy \n");
strcpy(imie2, imie);
printf("imie2 = %s, imie = %s\n", imie2, imie);
printf("*******test strcat \n");
strcat(imie, "Adela");
printf("imie == %s\n", imie);
return 0;
}
size_t typ wyniku sizeof(unsigned int).
Inne funkcje z biblioteki :
strcat
char *strcat(char *str1, const char *str2);
Złącza (konkatenuje) str1 ze str2. Wynik umieszcza w str1.
Nie rezerwuje pamięci!
strncat
char *strncat (char* strTo, const char* strFrom, size_t num);
Funkcja dopisuje pierwsze num znaków z tablicy strFrom na koniec tekstu w
tablicy strTo. W przypadku gdy długość strFrom jest mniejsza niż num, funkcja
przepisze wszystko.
Wartość zwracana: Funkcja zwraca wskaznik na strTo.
strchr
char *strchr(const char *str, int c);
Przykład:
char *pozycja;
pozycja = strchr(3 janek3 ,2 n2 );
Zwraca wskaznik do pierwszego wystąpienia znaku c w łańcuchu
str, lub NULL jeśli c nie występuje.
6
Podstawy programowania. Wykład 8  napisy
Małgorzata Nalbach-Moszyńska
strcmp
Porównanie dwóch napisów w kolejności leksykograficznej.
int strcmp(const char *str1, const char *str2);
Zwraca wartość:
0 gdy równe;
<0 gdy str1 < str2
>0 gdy str1 > str2
strncmp
int strncmp(const char *str1, const char *str2, size_t n);
jw dla pierwszych n bajtów
strcpy
char *strcpy(char *str1, const char *str2);
Kopiuje napis str2 do str1. Nie rezerwuje pamięci!
strncpy
char *strncpy(char *str1, const char *str2, size_t n);
jw dla pierwszych n bajtów
strlen
size_t strlen(const char *str);
Zwraca długość napisu.
7


Wyszukiwarka

Podobne podstrony:
Sieci komputerowe wyklady dr Furtak
Wykład 05 Opadanie i fluidyzacja
WYKŁAD 1 Wprowadzenie do biotechnologii farmaceutycznej
mo3 wykladyJJ
ZARZĄDZANIE WARTOŚCIĄ PRZEDSIĘBIORSTWA Z DNIA 26 MARZEC 2011 WYKŁAD NR 3
Wyklad 2 PNOP 08 9 zaoczne
Wyklad studport 8
Kryptografia wyklad
Budownictwo Ogolne II zaoczne wyklad 13 ppoz
wyklad09
Sporzadzanie rachunku przepływów pienieżnych wykład 1 i 2
fcs wyklad 5
Wyklad08 Zaopatrz wWode

więcej podobnych podstron