C Programmeren Handleiding Deel 5 – Karaktervariabelen

In de vorige twee handleidingen bespraken we de basisprincipes van variabelen, inclusief hoe ze geheugen innemen. Maar we richtten ons vooral op gehele getallen en floats. In deze zelfstudie gaan we het hebben over karakters (of char type variabelen).

Variabelen van het type ‘char’ nemen 1 byte (of 8 bits) in het geheugen in beslag. Zoals ik eerder vermeldde bij ‘int’ en ‘float,’ kun je de hoeveelheid geheugen die een karakter op je systeem inneemt nagaan met het volgende C programma:

#include <stdio.h>

int main (void)
{
printf("\n sizeof char in bytes is %u", sizeof(char));

return 0;
}

Op mijn systeem was de uitvoer als volgt:

 sizeof char in bytes is 1                                                                                               

Nu komt de vraag hoe je tekens als invoer van de gebruiker kunt aannemen en hoe je ze in uitvoer kunt afdrukken. Wel, voor het aannemen van tekens als invoer is er een speciale functie met de naam ‘getchar’. Evenzo heb je, om afzonderlijke karakters af te drukken, ‘putchar’. Het volgende stukje code moet je een beter idee geven over hoe deze functies werken:

#include <stdio.h>

int main (void)
{
int c;
c = getchar();
putchar(c);

return 0;
}

De bovenstaande code wacht bij uitvoering eerst tot de gebruiker een karakter invoert. Daarna voert het eenvoudig hetzelfde karakter op terminal uit.

Het kan je een beetje verbazen dat de waarde die ‘getchar’ teruggeeft in een geheel getal wordt opgeslagen, maar zo is het wel (de functie geeft een int terug). Maar je kunt de door ‘getchar’ geretourneerde waarde altijd vergelijken met een karakter. Hier is een voorbeeld:

#include <stdio.h>

int main (void)
{
int c;
c = getchar();
if(c == 'a')
{
printf("matched");
}
else
{
printf ("doesn't match");
}
return 0;
}

Dus hier, als de gebruiker ‘a’ invoert, dan drukt het programma ‘matched’ af in de uitvoer. Anders krijg je te zien ‘komt niet overeen’.

O, en ja, dit is de eerste keer dat we ‘if’ en ‘else’ verklaringen gebruiken. Zoals je inmiddels wel begrepen zult hebben, kun je met ‘if’ een reeks uitspraken uitvoeren als een voorwaarde waar is. Als de ‘if’ voorwaarde faalt, komt de code-uitvoering automatisch in een ‘else’ blok. Merk op dat je een ‘if’ statement kunt gebruiken zonder en ‘else’ statement, maar omgekeerd geldt dat niet.

Nu we terugkomen op getchar en putchar, laten we snel bespreken hoe deze functies gebruikt kunnen worden om problemen in het echte leven op te lossen. Stel dat je het aantal regels wilt tellen dat een gebruiker als invoer aan je programma geeft, dan kun je dat op de volgende manier doen:

#include <stdio.h>

int main (void)
{
int c =0, counter=0;
c = getchar();
while(c != EOF)
{
c = getchar();
if(c == '\n')
counter = counter+1;
}
printf("\n The input contains %d lines \n", counter+1);
return 0;
}

Om het bovenstaande programma te begrijpen, moet je eerst weten wat EOF is. Wel, EOF staat voor End Of File. Het wordt gebruikt om aan te geven dat de gebruiker klaar is met het invoeren van invoer.

Dus als je als gebruiker die invoer geeft klaar bent met het proces, druk je op ctrl+d (een paar keer). Het is deze actie die een waarde oplevert die gelijkwaardig is aan die van EOF, die in het programma gecontroleerd kan worden – net zoals we deden.

Terugkomend in het programma controleer je eerst het eerste karakter van de invoer om te zien of het EOF is. Is het dat niet, dan ga je de while lus in en controleer je voortdurend elk karakter tot je een EOF krijgt. Tijdens dit hele proces verhoog je, telkens als je een newline karakter (\n) krijgt, de variabele ’teller’.

Nadat en EOF is gedetecteerd, wordt de while lus beëindigd en drukken we het aantal regels af, dat één meer is dan de waarde van teller.

De reden dat we in de ‘printf’ functie één aan ’teller’ toevoegen is, dat het aantal regels altijd één meer is dan het aantal newline tekens (of in lekentaal, het aantal keren dat de gebruiker op de ‘Enter’ toets drukte). Natuurlijk is dit in de veronderstelling dat telkens als de gebruiker op enter drukt, hij ook wat tekst invoert.

Dus als je dit programma een invoer geeft als de volgende:

Hello 
Welcome to HowtoForge
Thanks  

De uitvoer zou zijn:

The input contains 3 lines

Merk op dat onze code ervan uitgaat dat de gebruiker ten minste één regel geeft. Een paar hoekgevallen worden met opzet niet behandeld om de zaken eenvoudig te houden. Een ervan is wanneer de gebruiker EOF geeft zonder een ander teken in de invoer op te geven, en het andere is wanneer een regel is gegeven zonder een newline teken op te geven.

Het berekenen van het aantal regels is maar één voorbeeld. Je kunt deze code ook uitbreiden om het totaal aantal door de gebruiker ingevoerde woorden te berekenen. Beschouw dit als een opdracht en probeer het zelf te coderen. Als hint zou ik zeggen: beschouw spaties (‘ ‘) en tabs (‘\t’), vergelijkbaar met de manier waarop we nieuwe regels (‘\n’) beschouwden om het aantal regels te berekenen.

Conclusie

In deze leerprogramma’s bespraken we wat meer over tekens, waaronder hoe ze te gebruiken, ze als invoer te accepteren en ze als uitvoer af te drukken. We bespraken ook een voorbeeld waarbij de functie getchar ons hielp het aantal regels in input te berekenen. Probeer wel de opdracht uit die ik in de laatste paragraaf gaf en laat het me weten als je twijfelt of vragen hebt.