Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilRůžena Hájková
1
OSNOVA: a) Řetězce v C b) Funkce stdio.h pro řetězce c) Funkce string.h pro řetězce d) Příklad Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 1 pro obor EST BPC1E PŘEDNÁŠKA 5
2
Řetězce v C (1/9) Řetězec: pole znaků (v paměti: 1 byte/znak – kód ASCII) zakončený terminátorem null (ASCII hodnota 0) ASCII kódy znaků v rozsahu 0 až 127, tj. hexadecimálně 0x00 až 0x7F, celosvětově standardizované ASCII kódy znaků v rozashu 128 až 255 ( unsigned ) nebo záporné ( signed ) závislé na aktuálně nastavené znakové sadě (národní znaky apod. UTF-8, Windows-1250, ISO-8859-x) – tzv. Extended ASCII Znaky pro číslice mají ASCII kódy 48 až 57, tj. hexadecimálně 0x30 až 0x39, postup pro vygenerování znaku: char ch; int num=5; ch = num|0x30; //or ch = num+0x30; printf("%d %c", ch, ch);
3
Řetězce v C (2/9) písmena velké anglické abecedy jsou uspořádaně od kódu 65, hexadecimálně 0x41 písmena malé anglické abecedy jsou uspořádaně od kódu 97, hexadecimálně 0x61 (rozdíl vůči stejným velkým písmenům je 32 nebo-li hexadecimálně 0x20)
4
int main(void) { unsigned char c; printf("Actual character set: \n\n"); for(c=32; c =32; c++) printf("ASCII code %d = character %c\n", c, c); scanf("%c", &c); return 0; } Př. Tisk všech tisknutelných znaků včetně Extended ASCII Řetězce v C (3/9) Extended znaky jsou dány nastavením OS (Win), std. UTF-8 Kombinované omezení v podmínce cyklu je nutné, kvůli přete- čení proměnné c přes maximum rozsahu unsigned char (255)
5
Výpis na obrazovku: Příklad: BPC1E_Ex28.c Řetězce v C (4/9)
6
Způsoby deklarace: char strA[5] = {’A’,’B’,’C’,’D’,’\0’}; – 4 znaky + znak null char strB[5] = "ABCD"; – 4 znaky, znak null vložen automaticky - na stejném principu se definuje řetězec v parametru printf() – počet prvků nemusí být uveden, kompilátor sám dopočítá char *strC = "ABCD"; - ukazatel na první znak, první znak ukazuje na následující, atd. až do null (nedoporučeno – možné kolize v paměti) Řetězce v C (5/9)
7
char S[7], T[7], c; char R[7]="ABCDEF"; int n; for(n=0; n first, R[n] != ’\0’ S[5-n] = R[n]; //or S[5-n] = *(R+n); S[6]='\0'; // S[n] = '\0' printf("%s\n", S); for(n=0; n small T[n] = R[n]+32; //or *(T+n) = *(R+n)+32; T[n]='\0'; printf("%s\n", T); Př. Převrácení textu a záměna velkých písmen za malá Řetězce v C (6/9) Příklad: BPC1E_Ex29.c
8
Př. Aritmetická manipulace se znaky - nad znaky lze provádět libovolné matematické a logické operace, přičemž pracujeme s jejich ASCII hodnotami { char text[]={92, 135, … 57, 100, 34, 0}; unsigned int n; printf("Input: %s\n", text); for(n=0; text[n]!='\0'; n++)// all chars in string if(n%5!=0) text[n]+=text[n-1]-102; else text[n]=160-text[n]; printf("Output: %s\n", text); return 0; } Řetězce v C (7/9) Příklad: BPC1E_Ex30.c
9
Př. Řetězec překódovaný do desítkového vyjádření ASCII kódů int main() { char texti[21]="Hello world!\n"; char textc[61]; char textd[21]; unsigned int n, m, p; printf("%s\n\n", texti); for(n=0, m=0; texti[n]!='\0'; n++) { p=texti[n]/100; textc[m++]=p+'0'; textc[m++]=texti[n]/10-p*10+'0'; textc[m++]=texti[n]%10+'0'; } textc[m]='\0'; printf("%s\n\n", textc); Řetězce v C (8/9)
10
a dekódování zpět for(n=0, m=0; textc[n]!='\0'; n++) { textd[m]=(textc[n++]-'0')*100; textd[m]+=(textc[n++]-'0')*10; textd[m++]+=textc[n]-'0'; } textd[m]='\0'; printf("%s\n", textd); return 0; } Řetězce v C (9/9) Příklad: BPC1E_Ex31.c Výstup:
11
Funkce pro řetězce (1/3) Funkce stdio.h pro řetězce (1/3) int main(void) { char c; puts("Is C language easy?"); // unformated printing of string to stdout followed by new line c=getchar(); // get char.from the standard input if (c=='y') puts("Right,..."); if (c=='n') puts("I disagree,..."); do c=getchar(); while(c!=' ');// wait for space return 0; } Funkce neformátovaného výstupu řetězce puts() a vstupu znaku getchar() Příklad: BPC1E_Ex32.c
12
int main(void) { char c; for(c='A'; c<='Z'; c++) // loop for all alphabet { putchar(c); // printing character to // the stdout - capital putchar(c+32); // small putchar('\n'); // new line } doc=getchar(); while(c!=' '); // wait for space return 0; } Funkce pro výstup znaku putchar() Funkce pro řetězce (2/3) Funkce stdio.h pro řetězce (2/3) Příklad: BPC1E_Ex33.c
13
int main(void) { char fname[20], sname[20], c; printf("Insert your first name: "); gets(fname); // reading characters from stdin and // stores them as a string - first name printf("\nInsert your surname: "); gets(sname); // reading surname printf("\nYour whole name is: %s %s", fname, sname); scanf("%c", &c); return 0; } Funkce pro vstup neformátovaného řetězce gets() Funkce pro řetězce (3/3) Funkce stdio.h pro řetězce (3/3) Příklad: BPC1E_Ex34.c Funkce gets() automaticky vynechává znak ’\n’
14
#include #include //library for ops. with strings int main(void) { char s_inp[6]={'a','b','c','d','e','\0'}; // or char s_inp[6] = "abcde"; char s_out[6], c; strcpy(s_out, s_inp); //copying of string, not possible s_out = s_inp; printf("%s\n", s_out); scanf("%c", &c); return 0; } Funkce pro kopírování řetězců strcpy() Funkce pro řetězce (1/5) Funkce string.h pro řetězce (1/5) Příklad: BPC1E_Ex35.c
15
char S[20], T[20], c; char R[20]="ABCDEF"; int n; for(n=0; n first S[strlen(R)-n-1]=R[n]; S[n]='\0'; printf("%s\n", S); for(n=0; n small T[n]=R[n]+32; T[n]='\0'; printf("%s\n", T); Funkce pro určení délky řetězce (návratová hodnota) strlen() Příklad: BPC1E_Ex36.c Funkce pro řetězce (2/5) Funkce string.h pro řetězce (2/5)
16
char final[30]; char first[]="wine"; char second[]="women"; char third[]="songs"; strcpy(final, first); strcat(final, second); // appends a copy of the // source string to the destination string strcat(final, third); printf("%s\n", final); Funkce pro spojování řetězeců strcat() Funkce pro řetězce (3/5) Funkce string.h pro řetězce (3/5) Příklad: BPC1E_Ex37.c Modifikovaná funkce strncat(str1,str2,n) připojí řetězec str2 k řetězci str1, přičemž se použije jen prvních n znaků Znak null se vkládá automaticky na konec spojeného řetězce
17
char number [11], c; char *ptr, digit='8'; strcpy(number, "1487265098"); printf("Original string: %s\n", number); ptr=strchr(number, digit); while(ptr) { *ptr='x'; ptr=strchr(number, digit); } printf("Modified string: %s", number); Funkce pro vyhledání znaku v řetězci strchr() Funkce pro řetězce (4/5) Funkce string.h pro řetězce (4/5) Náhrada všech znaků 8 v řetězci za znak x : Příklad: BPC1E_Ex38.c
18
char txt1[51], txt2[5], txt3[5]="----", *ptr; int n; printf("Insert text1: "); gets(txt1); printf("Insert text2 (searched): "); gets(txt2); n=strlen(txt2); ptr=strstr(txt1, txt2); while(ptr) { strncpy(ptr,txt3,n); ptr=strstr(txt1, txt2); } printf("Modified string: %s", txt1); Funkce pro vyhledání řetězce v řetězci strstr() a kopíro- vání n znaků řetězce strncpy() Funkce pro řetězce (5/5) Funkce string.h pro řetězce (5/5) Příklad: BPC1E_Ex39.c
19
Řetězce – příklady (1/2) Př. Řetězec num obsahuje neznámý počet celých a desetinných čísel. Každé číslo je ukončeno středníkem. Spočítejte, kolik je zapsáno v řetězci čísel a kolik z nich je čísel celých. char num[30]="12;3.8;100;94.5;33;44;"; int n, total=0, rat=0; printf("Numbers: %s\n\n", num); for(n=0; n<strlen(num); n++) { if(num[n]==';') // total number of num. total++; if(num[n]=='.') // number of rational n. rat++; } printf("Total number of num.: %4d\n", total); printf("Integer numbers: %4d\n", total-rat); Příklad: BPC1E_Ex40.c
20
Př. Řetězec num obsahuje neznámý počet celých čísel. Každé číslo je ukončeno středníkem. Čísla vypište do sloupce pod sebe a zarovnejte je. char num[30]="12;4;100;95;33;44;", part[10]; int m=0, n; printf("Numbers: %s\n\n", num); for(n=0; n<strlen(num); n++) if(num[n]!=';') part[m++]=num[n]; else { part[m]='\0'; printf("%6s\n", part); m=0; } Řetězce – příklady (2/2) Příklad: BPC1E_Ex41.c
21
Téma následující přednášky DĚKUJI ZA POZORNOST – Ukazatel a adresace paměti – Pole a ukazatelé – Pole ukazatelů – Příklady
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.