C++ standardbibliotek Tecken- och stränghantering



Relevanta dokument
Snabbslumpade uppgifter från flera moment.

ELEV- HANDLEDNING (Ansökan via webben)

1 Funktioner och procedurell abstraktion

Lathund, procent med bråk, åk 8

DOP-matematik Copyright Tord Persson. Bråktal Läs av vilka tal på tallinjen, som pilarna pekar på. Uppgift nr

FRÅN A TILL Ö LäraMera Ab / och Allemansdata Ab / FRÅN A TILL Ö

TDIU01 - Programmering i C++, grundkurs

Programmera en NXT Robot

TDIU01 - Programmering i C++, grundkurs

Efter att du har installerat ExyPlus Office med tillhörande kartpaket börjar du med att göra följande inställningar:

Klasser och objekt i C#

Tecken. char. char ch = A ; sizeof(char) = 1 byte (ej 16-bitars tecken som i Java) char namn[]= "Nils"; // längd = 5 bytes

Tentamen i Programmering grundkurs och Programmering C

Att koda en magnetremsa i plastkortskrivare med inbyggd magnetkodare.

Webb-bidrag. Sök bidrag på webben Gäller från

Exempel på tentamensuppgifter i LMA100, del 1

Enkla datatyper minne

D A B A D B B D. Trepoängsproblem. Kängurutävlingen 2012 Benjamin

Tecken & Strängar. Kapitel 7

Sammanfattning av kursdag 2, i Stra ngna s och Eskilstuna

Avsändare och mottagare

( ostream ) << ( annan datatyp ) : ostream

Procent - procentenheter

Administrera utskick på utbildningstillfälle

Vad är en webbläsare?

TIMREDOVISNINGSSYSTEM

TIMREDOVISNINGSSYSTEM

Hel tjänstledighet för att prova annan anställning inom Göteborgs universitet.

DATASAMORDNING NYHETERNA I CHAOS Utbildning Chaos/Handledning - Nyheterna i Chaos 3/

a n = A2 n + B4 n. { 2 = A + B 6 = 2A + 4B, S(5, 2) = S(4, 1) + 2S(4, 2) = 1 + 2(S(3, 1) + 2S(3, 2)) = 3 + 4(S(2, 1) + 2S(2, 2)) = = 15.

Lathund för överföring av rapporter och ljudfiler

Gissa det hemliga talet

Skriva B gammalt nationellt prov

Snabbhjälp till. Kristian. elevdata.se

Handledning för digitala verktyg Talsyntes och rättstavningsprogram. Vital, StavaRex och SpellRight

Algebra, polynom & andragradsekvationer en pampig rubrik på ett annars relativt obetydligt dokument

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

ANVÄNDARHANDLEDNING FÖR

Diskussionsfrågor till version 1 och 2

1 Texthantering. 1.1 Typen char. Exempel, skriv ut alfabetet

Två konstiga klockor

Individuellt Mjukvaruutvecklingsprojekt

Så här påverkar villkorsändringen. Avtalspension SAF-LO. Möjlighet till återbetalningsskydd

Funktionsbeskrivning

Till exempel en array av heltal(int) skapas på följande sätt:

Användarmanual och policy för Göteborgs Evenemangskalender på goteborg.com

Hävarmen. Peter Kock

Särskilt stöd i grundskolan

Linjära system av differentialekvationer

SA33 - Val av kurser inom program m terminsreg

Infobric Ease Snabbguide

Programexempel: tärningsspel

Partnerskapsförord. giftorättsgods görs till enskild egendom 1, 2. Parter 3. Partnerskapsförordets innehåll: 4

Vad är det och hur definierar vi en Biblioteksfunktioner (math) Top-down-programmering lokala globala variabler Arrays som in-parametrar

EWEBB. Ersätter pappersblanketter, såsom T2, T3, ledighetsansökan, reseräkning.

Handbok Ämnesprov 2016 Lärarinmatning I Dexter Åk 3. Uppdaterad: /HL Version: IST AB

Träning i bevisföring

Introduktion till arv

ANVÄND NAVIGATIONEN I CAPITEX SÄLJSTÖD

Omvandla Vinklar. 1 Mattematiskt Tankesätt

Kursplan i svenska. Därför tränar vi följande färdigheter under elevens skoltid i ämnet svenska: Tala, lyssna och samtala. År 1

Manual för Min sida 1/ rev

UTMANINGAR OCH MÖJLIGHETER HAR DU 730 DAGAR OCH ETT STARKT DRIV DÅ HAR VI EN LEDARROLL TILL DIG

Att använda pekare i. C-kod

Manual för BPSD registret. Version 6 /

Moment 2 - Digital elektronik. Föreläsning 1 Binära tal och logiska grindar

Föreläsning 3: Vector och struct

Krigsreportage inbo rdeskriget i Bosnien

Föreläsning 8: Räkning. Duvhålsprincipen. Kombinatorik

Design by. Manual Jossan.exe. Manual. till programmet. Jossan.exe. E-post:

Skillnaden före och efter Black & White

Matematikboken. alfa. Lennart Undvall Christina Melin Jenny Ollén

TDIU01 - Programmering i C++, grundkurs

Sammanfattning på lättläst svenska

Föreläsning 5: Rekursion

Axiell Arena. Samarbeta om bilder Regionbiblioteket i Kalmar län

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Med detta och följande avsnitt blir det något svårare. Det finns också

Ändra föreningsuppgifter i föreningsregistret i Interbook

Anvisningar webbansökan Transportbidrag

IdrottOnline Lathund för inmatning av Nyhet

PBL om tidsbegränsade bygglov m.m

När du som vårdpersonal vill ta del av information som finns hos en annan vårdgivare krävs det att:

Hur du arbetar med VFU-portfölj i Mondo. en lathund för student

Det andra alternativet är att ladda upp filer genom att klicka på plustecknet nere till vänster. Man klickar sig in på den mapp som man vill att

5 Grundläggande in- och utmatning

David Wessman, Lund, 30 oktober 2014 Statistisk Termodynamik - Kapitel 5. Sammanfattning av Gunnar Ohléns bok Statistisk Termodynamik.

OPTIMIZING THE LINE. CAB Group AB Stortorget 11, SE Örebro, Sweden Phone:

Q1 Hur många undervisningstillfällen har du haft under september månad?

Administratör Rollbeskrivning och stödjande instruktion. e-tjänst för ansökan om statsbidrag Senast uppdaterad:

Sveriges Trafikskolors Riksförbund Film om körkort för nysvenskar Speakertext - Svensk

Frågor i ansökan om statsbidrag för läxhjälp år 2016 skolhuvudmän

Rehabkollen Ditt stöd i rehabiliteringsarbetet

Ha det kul med att förmedla och utveckla ett knepigt område!

Enkätresultat för elever i år 2 i Nösnäsgymnasiet 2 i Stenungsund våren 2014

Enkätresultat för elever i år 2 i Mega Musik gymnasium hösten Antal elever: 47 Antal svarande: 46 Svarsfrekvens: 98% Klasser: MM13

FINANSIERING FÖR PRIVATPERSONER

Raindanceportalen 2005, manual bokföringsorder Bokföringsportalen. Manual för samordnare. Utbildning Ekonomiadministrativa enheten

LÄSFÖRSTÅELSE PROVKAPITEL. Katarina Neiman Hedensjö

Transkript:

C++ standardbibliotek Tecken- och stränghantering Tommy Olsson, Institutionen för datavetenskap, Linköpings universitet, 2012 Funktioner som presenteras här kan användas för teckenklassificering, teckenomvandling, omvandling mellan numeriska typer och sträng, både för C++-strängar (string och wstring) och C-strängar (nullteckenavslutade teckenfält), kopiering, jämförelse, etc. av C-strängar och motsvarande funktioner för byte/minnesblock. Varierande teckenuppsättningar, alfabeten, konventioner, etc., så kallad lokalisering (localization) är ett problem i detta sammanhang och stödet varierar mellan plattformar. Vanligtvis är det inte helt enkelt att få till det med svenska bokstäver. Beteendet hos vissa funktioner kan modifieras genom att ändras med hjälp av setlocale(3c). 1. Teckenklassificering Funktionerna nedan kan appliceras på ett tecken och returnerar sant (ett värde skiljt från 0) om tecknet tillhör kategori som funktionen avser, annars falskt (0). Inkludera <cctype>. int isalnum(c) int isalpha(c) returnerar sant om c är ett alfanumeriskt tecken (isalpha(c) eller isdigit(c) sant) returnerar sant om c är ett alfabetiskt tecken int isascii(c) returnerar sant om c är ett 7-bitars ASCII-tecken (teckenkod mellan 0 och 0177) int iscntrl(c) returnerar sant om c är ett styrtecken (control character) int isdigit(c) returnerar sant om c är ett decimal siffertecken ( 0-9 ) int isgraph(c) int islower(c) int isprint(c) int ispunct(c) int isspace(c) int isupper(c) int isxdigit(c) returnerar sant om c är ett skrivbart tecken (ispunct(c), isupper(c), islower(c), eller isdigit(c) returnerar sant) returnerar sant om c är ett liten bokstav returnerar sant om c är ett skrivbart tecken, inklusive mellanrumstecknet (ispunct(c), isupper(c), islower(c) eller isdigit(c) sant eller mellanrumstecken) returnerar sant om c är ett skrivbart tecken som ej är mellanrum, bokstav eller siffra (inte mellanrum och varken isalnum(c) eller iscntrl(c) returnerar sant) returnerar sant om c är ett mellanrum, tabuleringstecken, vagnreturtecken, nyradstecken, vertikaltabuleringstecken eller sidmatningstecken (standard white space) returnerar sant om c är en stor bokstav returnerar sant om c är en hexadecimal siffra (0-9, A-F). Det finns även motsvarande funktioner som tillhör <locale>. Dessa tar ett lokaliseringsobjekt som ett andra argument, till exempel isalpha(c, loc), och returnerar bool. 2. Teckenomvandling Dessa funktioner tar ett argument av typen int och returnerar ett värde av typen int. Argumentes värde ska representera en unsigned char eller värdet för EOF (end-of-file). Om argumentet har något annat värde returneras detta opåverkat. Inkludera <cctype>. int tolower(c) om c är en stor bokstav returneras motsvarande liten bokstav (som int) int toupper(c) om c är en liten bokstav returneras motsvarande stor bokstav (som int) Det finns även motsvarande funktioner som tillhör <locale>. Dessa tar ett lokaliseringsobjekt som ett andra argument, till exempel tolower(c, loc) och returneras samma teckentyp som c har. 1 (5)

3. Exempel teckenhantering #include <cctype> #include <iostream> #include <locale> using namespace std; int main() { cout << boolalpha; setlocale(lc_all, "sv"); // Svensk locale // om c inte är unsigned, kanske dessa inte anses vara bokstäver for (unsigned char c : { Å, Ä, Ö, å, ä, ö }) { cout << c << " är alfabetisk...: " << bool(isalpha(c)) << \n ; cout << c << " är alfanumerisk.: " << bool(isalnum(c)) << \n ; cout << c << " är liten bokstav: " << bool(islower(c)) << \n ; cout << c << " är stor bokstav.: " << bool(isupper(c)) << \n ; cout << "toupper(" << c << "): " << char(toupper(c)) << \n ; cout << "tolower(" << c << "): " << char(tolower(c)) << "\n\n"; } return 0; } 4. Numeriska omvandlingar för string och wstring 4.1 Från numerisk typ till sträng För att omvandla värden av typ int, unsigned, long, unsigned long, long long, unsigned long long, float, double eller long double till motsvarande sträng finns följande funktioner. std::string to_string(i) std::wstring to_wstring(i) 4.2 Från sträng till numerisk typ omvandlar i till std::string omvandlar i till std::wstring Funktionernas nedan finns även för omvandling från std::wstring. Utöver den sträng vars innehåll ska omvandlas kan en adress till en variabel av typ std::size_t (idx) och önskad talbas (base) anges. Om det omvandlade värdet ligger utanför värdeintervallet för returtypen kastas out_of_range. Om funktionen inte kastar och idx!= 0, sparas index för det första ej omvandlade tecknet i indatasträngen i *idx. Vid enkel användning anges bara den sträng som ska omvandlas. 4.2.1 Omvandling från sträng till heltalstyp int stoi(const string& str, size_t* idx = 0, int base = 10); long stol(const string& str, size_t* idx = 0, int base = 10); unsigned long stoul(const string& str, size_t* idx = 0, int base = 10); long long stoll(const string& str, size_t* idx = 0, int base = 10); unsigned long long stoull(const string& str, size_t* idx = 0, int base = 10); 4.2.2 Omvandling från sträng till flyttalstyp float stof(const string& str, size_t* idx = 0); double stod(const string& str, size_t* idx = 0); long double stold(const string& str, size_t* idx = 0); 2 (5)

4.3 Omvandling med strängströmmar Typomvandling mellan sträng och numerisk typ och tvärt om kan göras med strängströmmar, istring_stream och ostring_stream (inkludera <sstream>) och de formaterande operatorerna >> och <<. Detta kan vara ett alternativ om man ska göra lite mer än bara typomvandla enskilda talvärden och man kan utnyttja den felkontroll som görs då man läser från strömmar. 5. C-strängsoperationer I C++ det finns även funktioner för att hantera C-strängar och fält i allmänhet fält ( minnesblock ). Funktionerna nedan vars namn börjar med str förutsätter att indata är C-strängar, dvs teckensträngar som avslutas med \0 (null-tecken). Implementeringen av funktionerna bygger på att sådana nulltecken finns för att markera slutet på strängarna. Funktioner vars namn börjar med mem är mer generella och tar ett argument som anger hur många byte data som ska kopieras, jämföras, etc. Inkludera <cstring>. 5.1 Kopiering void* memcpy(p1, p2, n) void* memmove(p1, p2, n) char* strcpy(s1, s2) char* strncpy(s1, s2, n) kopierar n byte direkt från det minnesblock som p2 pekar på till det som p1 pekar på (för överlappande minnesblock är memmove säkrare). kopierar n byte från minnesblocket som p2 pekar på till det som p1 pekar på; minnesblocken kan överlappa. kopierar s2 till s1, inklusive \0 ; returnerar s1 kopierar de n första tecknen från s2 till s1; om \0 påträffas i s2 innan n tecken har kopierats görs utfyllnad med nollor; \0 läggs inte till i s1 om s2 är längre än n tecken (s1 blir ingen C-sträng); returnerar s1. 5.2 Sammansättning char* strcat(s1, s2) kopierar s2 till slutet av s1; avslutande \0 i s1 skrivs över av det första tecknet i s2 och \0 läggs till sist i s1; returnerar s1; s1 och s2 får inte överlappa. char* strncat(s1, s2, n) lägger till de n första tecknen i s2 till slutet av s1 och avslutande \0 ; om längden av s2 är kortare än n kopieras endast tecknen fram till \0. 5.3 Jämförelse int memcmp(p1, p2, n) jämför de första n byten i p1 på med de första n byten i p2; returnerar 0 om alla byte överensstämmer annars ett värde skiljt från 0 som representerar vilken som är större där de skiljer. int strcmp(s1, s2) jämför s1 och s2 till dess tecknen skiljer eller \0 påträffas; returnerar 0 om s1 och s2 är lika, ett värde mindre än noll om det första tecknet som skiljer har ett mindre värde i s1 än i s2, ett värde större än noll annars. int strcoll(s1, s2) int strncmp(s1, s2, n) size_t strxfrm(s1, s2, n) jämför s1 och s2 som strcmp() ovan men tecknen tolkade enligt aktuell locale (kategorin LC_COLLATE); se strcmp() för returvärde. jämför upp till n tecken i s1 med motsvarande tecken i s2; jämförelsen pågår till dess två tecken skiljer eller \0 påträffas eller n tecken har jämförts; se strcmp() för returvärde. transformerar tecknen i s2 enligt aktuell locale (kategorin LC_COLLATE) och kopierar de n första tecknen i den transformerade strängen till s1 och returnerar dess längd; s1 och s2 får inte överlappa; s1 kan vara en tompekare om n är lika med 0 och i så fall returneras enbart längden. 3 (5)

5.4 Sökning void* memchr(p, c, n) char* strchr(s, c) char* strcspn(s1, s2) char* strpbrk(s1, s2) char* strrchr(s, c) size_t strspn(s1, s2) char* strstr(s1, s2) char* strtok(s1, s2) söker i de n första byten av det minnesblock som p pekar på efter den första förekomsten av c (tolkat som unsigned char); returnerar pekare till den första förekomsten av c, eller en tompekare om ingen träff. returnerar pekare till första förekomsten av tecknet c i s, eller tompekare om ingen träff. söker i s1 efter första förekomsten av något av de tecken som ingår i s2 och returnerar antalet tecken som lästs innan den första förekomsten hittades (längden av s1 om ingen träff). som strcspn() ovan men returnerar en pekare till den första förekomsten, eller tompekare om ingen träff. returnerar pekare till den sista förekomsten av tecknet c i s, eller tompekare om ingen träff. returnerar längden för den inledande del av s1 som enbart innehåller tecken som ingår i s2 (om alla tecken i s1 finns i s2 returneras längden av s1, om första tecknet i s1 inte ingår i s2 returneras 0). returnerar en pekare till den första förekomsten av C-strängen s2 i C-strängen s1 eller en tompekare om ingen sådan delsträng finns i s1. en sekvens av anrop till denna funktion delar upp strängen s1 i delar, token, som består av teckenföljder som avgränsas av något av tecken i s2. Vid det första anropet förväntas s1 vara en C-sträng, vid efterföljande anrop förväntas en tompekare och då används i stället positionen direkt efter den senast hittade token som startpunkt för vidare läsning. När en token bestämts sätts \0 in för att markera slutet och en pekare till början returneras. När inga fler token finns returneras en tompekare. 5.5 Längd size_t strlen(s) returnerar längden för s (antal tecken fram till \0 ) 5.6 Övrigt void* memset(p, c, n) char* strerror(errnum) sätter de n först byten i minnesblocket som p pekar på till c (tolkat som unsigned char) tolkar värdet på errnum och genererar en sträng med ett motsvarande felmeddelande 5.7 Numerisk omvandlingar för C-strängar Inkludera <cstdlib> för att använda dessa funktioner. En del funktioner tar ett andra argument, endp, vilket ska vara en variabel av typ char*, i vilken funktionen kan placera en pekare som pekar på det första tecknet efter talet som omvandlats. Syftet med detta är att om man har flera tal i samma sträng ska man successivt kunna omvandla dessa. Exempel: char numbers[] = 4711 11147 17 ; char* endp; long int a = strtol(numbers, endp); long int b = strtol(endp, &endp); long int c = strtol(endp, &endp); // 4711 läses, strtol ändrar endp // 11147 läses, strtol flyttar fram endp // 17 läses, strtol flyttar fram endp Om man inte är intresserad av denna möjlighet anropas funktionen med en tompekare som argument. till endp. 4 (5)

5.7.1 Omvandling från C-sträng till heltalstyp int atoi(s) long int atol(s) long long int atoll(s) long strtol(s, endp) long long int strtoll(s, endp) unsigned long int strtoul(s, endp) unsigned long long int strtoull(s, endp) 5.7.2 Omvandling från C-sträng till flyttalstyp, s är en C-sträng double atof(s) double strtod(s, endp) float strtof(s, endp) long double strtold(s, endp) 5 (5)