







===========  C - Programmering  Amiga OS 2.xx  ===================
                                              Av Kjell Cederfeldt.
Del 9. Söndag den 17 Maj 1992.
-------------------------------


Egen strlen funktion
--------------------

Vi förbättrar "vår" strlen funktion. I exemplet fanns begränsningar
på antal tecken till 15.



#include<stdio.h>

main() /* Strlen */
{
   char namn[40] = "Sven Svensson";  /* gör plats för 40 tecken */

   printf("Namnet är: %s och innehåller %d tecken.\n", namn, Strlen(namn));

}
Strlen(instring)
char *instring;
{
    int antal = 0;

    while(1)   /* evig slinga */
    {
       if (instring[antal] == '\0')  /* om slut på sträng */
       {
          return(antal);  /* returnera värdet antal */
          break;
       }
       antal++;

    }

return(0);
}

Spara! kompilera och länka med LC -L Strlen.c


RESULTAT
--------

Namnet är: Sven Svensson och innehåller 13 tecken.


FÖRKLARING
----------

char *instring;

Vi deklarerar instring som en pekare (en stjärna före anger det).
variabeln tar bara upp en adresspekare som anger var i minnet
variabeln finns. Vi kommer att förklara mer om pekare senare.

while(1)

Kommandot while är inte heller en funktion utan ett inbyggt kommando
Du kanske tycker att det börjar kännas lite jobbigt att hålla reda
på vilka som är kommandon och vilket som är funktioner. Man får
lära sig detta. Men det finns inte så många kommandon som har samma
utseende som funktioner. Man lär sig dessa efter ett tag. Så du kan
vara helt lugn. Kommandot while är också ett sling-kommando. Den
upprepar allt innanför klamrarna så länge argumentet mellan
paranteserna är sant (TRUE). I vårt fall har vi valt 1 som fast
värde, detta betyder att slingan upprepas i evigheter.


if (instring[antal] == '\0')

Vi jämför om tecken i platsen 'antal' i listan har samma värde som
tecknet null har ('\0'). I så fall utför satserna mellan klamrarna.


return(antal);


kommanot return() lämnar tillbaka ett returnvärde till funktionen
som anroppade Strlen (i vårt fall main). Om antal är 5 så blir tal
5 i detta uttrycket:  tal = Strlen(namn). Variabeln tal får sitt
värde från funktionens returvärde. Funktionen anslutas här. Allt
efter return() utförs ej. Man kan ha flera return() kommandon i sin
funktion. Ett smidigt sätt att fly ur en funktion.


break;

I vårt fall kommer aldrig break att utföras eftersom att return
på raden ovan avslutar funktionen. Men det anses som "snyggt" att
skriva med break; satsen har tagits med ändå, eftersom den anger
att while satsen skall avbrytas. Detta är det ända sättet att
bryta while satsen med det villkor som vi satte upp i vårt exempel.


Jämföra två strängar.
---------------------

Om man vill jämföra två strängar, och utföra något om de är lika,
kan man INTE skriva:

if (string1 == string2)
{
	printf("Stängarna är lika");
}

Två likamed tecken (==) betyder i och för sig 'om lika'. Men
eftersom strängar inte är en datatyp utan en lista med många
sammankopplade char-datatyper. Man skulle kunna göra en slinga
som i ett exempel tidigare. Men detta är inte speciellt bra om
man bara skall kolla om strängen är exakt lika. Vill man
göra någon annan kontroll än bara 'om de är lika', får det bli en
slinga. Det finns en färdig funktion för att göra en sådan test.

strcmp() 'StringCompare'. Funktionen kräver två argument - de båda
strängarna som skall testas. Funktionen lämnar ett returvärde så
att vi skall kunna veta resultatet. Resultatet kan antingen vara
negativt, positivt eller noll.

char s1[256];
char s2[265];

retur = strcmp(s1, s2);


Ett Exempel
-----------

#include<stdio.h>
main()
{
   printf("%d\n",strcmp("A","A"));
   printf("%d\n",strcmp("A","B"));
   printf("%d\n",strcmp("B","A"));
   printf("%d\n",strcmp("C","A"));
   printf("%d\n",strcmp("foton","foto"));
}

Spara! kompilera och länka med LC -L Strcmp.c

RESULTAT
--------

0
-1
1
1
1

Som vi ser ger en jämförelse mellan två A, returvärdet noll. Alltså
en nolla som resultat, betyder att de båda strängarna är lika.

Men om de inte är lika kan vi få antingen ett negativ eller ett
positivt resultat. (Latticen ger -1 el. 1, men andra kompilatorer
kan ge resultat som 2 -14 osv....).

Normalt är det ointressant att veta mer än om strängen är lika eller
inte. Men om man skall sortera en strängar i en lista eller likn. så
kan det vara bra att veta om strängen är större eller mindre.

Ett positivt tal betyder att den första strängen är större (B är
större än A) än den andra. Som vi ser så är också "foton" större än
"foto". 'N' sist i "fonton" är ju större en nolltermineringen sist
i "foto".

Ett negativt tal anger att den första strängen är mindre än den
andra.


EXTRA
-----

ANSI C har förutom strcmp också ett par liknande funktioner.

strcmp()     Jämför två strängar
strcmpi()    Jämför två strängar, (case-insensitive)
stricmp()
strncmp()
strnicmp()



#include<stdio.h>
main()
{

   if (strcmp("string", "STRING"))
   {
     printf("Strängarna är olika\n");
   }
   else
   {
     printf("Strängarna är lika\n");
   }
   
}

Spara! kompilera och länka med LC -L Strcmp.c


RESULTAT
--------

Strängarna är olika

Eftersom den ena stängen är skriven med små bokstäver och den
andra med stora, anser inte strcmp att strängarna är lika.
En stor bokstav har ju inte samma AscII värde som en liten. Så
strcmp har rätt. Men om vi ändå vill göra en case-insensitive
(storleksoberoende) test kan vi använda funktionen strcmpi().

Här kommer exeplet
------------------

#include<stdio.h>
#include<string.h>
main()
{

   if (strcmpi("string", "STRING"))
   {
     printf("Strängarna är olika\n");
   }
   else
   {
     printf("Strängarna är lika\n");
   }
   
}

OBS! Notera att en ny include sats har tagits med.


RESULTAT
--------

Strängarna är lika

 -Precis vad jag behöver! :-)



Standard strängfunktioner.
--------------------------

strcmp()    Jämför två strängar.
strcmpi()   Jämför två strängar. (Bokstavsstorleks oberoende)
stricmp()   Jämför två strängar. (Bokstavsstorleks oberoende)
strncmp()   Jämför två strängar, max antal tecken.
strnicmp()  Jämför två strängar, max antal tecken, (No case)

stccpy()    Kopiera en sträng till en annan
stpcpy()    Kopiera en sträng till en annan
strcpy()    Kopiera en sträng till en annan
strncpy()   Kopiera en sträng (max antal tecken)

strcat()    Slå ihop två strängar
strncat()   Slå ihop två strängar (max antal tecken)

strlen()    Antal tecken i en sträng.
stclen()


@BEGIN_FILE_ID.DIZVery good C Guide in swedish.
@END_FILE_ID.DIZ
