Tecken & Strängar Kapitel 7
Datatypen char Alla tecken i teckenuppsättningen Synliga och andra ASCII American Standard Code for Information Interchange Numera 256 tecken (8 bitar (2 8 ) numreras 0..255) Ett enskilt värde anges med enkelsnuttar 't', '5', 'W', '!' HT2012 thomasj, marie, kallin@cs.umu.se F5-2
Datatypen char char är en datatyp på samma sätt som int eller float char c; // ett enda tecken c = 'A'; Egentligen heltalstyp! T.ex. '0' 48, 'A' 65, 'a' 97 'A' < 'a' HT2012 thomasj, marie, kallin@cs.umu.se F5-3
ASCII-tabellen HT2012 thomasj, marie, kallin@cs.umu.se F5-4
Extended ASCII (PC) HT2012 thomasj, marie, kallin@cs.umu.se F5-5
ANSI (Windows) HT2012 thomasj, marie, kallin@cs.umu.se F5-6
"Kodf\x94rvirring" Olika system använder olika teckenkoder Tangenten lilla ä i Windows ger koden \xe4, som visas som i kommandofönstret \x94 ger lilla ö t.ex. \xnn kan användas som ett tecken och även i texter HT2012 thomasj, marie, kallin@cs.umu.se F5-7
Att arbeta med tecken Läs med getchar() finns i stdio.h Skriv ut med putchar() eller printf() Många funktioner för tecken T.ex. isalpha() finns i ctype.h Kontrollerar om parametern är en bokstav Fler: isdigit(), islower(), isupper(), ispunct(), isspace() mm. HT2012 thomasj, marie, kallin@cs.umu.se F5-8
#include <stdio.h> #include <stdlib.h> #include <ctype.h> int main(void){ char c; Exempel printf("skriv ett tecken : "); c = getchar(); if (isalpha(c)) printf("%c är en bokstav\n", c); if (isdigit(c)) printf("%c är en siffra\n", c); if (isspace(c)) printf("%c är ett mellanslag eller en tab\n", c); } return 0; HT2012 thomasj, marie, kallin@cs.umu.se F5-9
ASCII-koden #include <stdio.h> #include <stdlib.h> int main(void) { char c; do { printf("skriv ett tecken, avsluta med X : "); c = getchar(); printf("ascii-koden för %c är %d\n", c, c); } while (c!= 'X'); } return 0; HT2012 thomasj, marie, kallin@cs.umu.se F5-10
#include <stdio.h> #include <ctype.h> int main(void){ const int MAXSTRING = 100; char c, name[maxstring]; int i = 0, j; int antal = 0; printf("hej! Vad heter du? "); while ((c = getchar())!= '\n') { name[i] = c; if (isalpha(c)) // om vi hittat bokstav antal = antal + 1; i++; } name[i] = '\0'; Have a nice day! HT2012 thomasj, marie, kallin@cs.umu.se F5-11
Have a nice day! printf("trevligt att träffas %s.\n",name); printf("baklänges blir ditt namn "); for (j = i-1; j >= 0; j--) putchar(name[j]); printf("du har %d bokstäver i ditt namn.\n", antal); printf("ha en bra dag!\n"); } return 0; HT2012 thomasj, marie, kallin@cs.umu.se F5-12
Körning Hej! Vad heter du? Marie Trevligt att träffas Marie. Baklänges blir ditt namn eiram Du har 5 bokstäver i ditt namn. Ha en bra dag! HT2012 thomasj, marie, kallin@cs.umu.se F5-13
Strängar Egentligen en array av tecken char str[10] = "Min text!"; Strängslutet markeras med '\0' Tecknet med ASCII-värdet 0 Nolltecknet NUL eller NULL 0 1 2 3 4 5 6 7 8 9 str 'M' 'i' 'n' ' ' 't' 'e' 'x' 't' '!' \0 77 105 110 32 116 101 120 116 33 0 HT2012 thomasj, marie, kallin@cs.umu.se F5-14
Läsa strängar I stdio.h finns getchar() Läser ett tecken i taget Resultatet kan testas mot \n I stdio.h finns även gets() Läser till \n Returnerar en "sträng" Måste se till att \0 ryms! Säkrare att använda är fgets(str, length, stdin); Men scanf() då? Läser ett "token" HT2012 thomasj, marie, kallin@cs.umu.se F5-15
Skriva strängar Enkelt med printf() Conversion character %s för strängar %c för ett enstaka tecken %d om man vill se ASCII-koden (heltal) Man kan också använda puts() puts("hej på dej"); men då kan man bara skriva ut text HT2012 thomasj, marie, kallin@cs.umu.se F5-16
Operationer på strängar I string.h finns många funktioner strlen(str) ger antal tecken i str strcmp(s1, s2) retunerar om (s1<s2), 0 om (lika) eller + om (s1>s2) strcat(s1, s2) retunerar s1 konkatenerad med s2 i s1 strcpy(s1, s2), strncpy(s1, s2, len) tecknen i s2 kopieras till s1, max len st HT2012 thomasj, marie, kallin@cs.umu.se F5-17