Invoer is de levensader van elk interactief programma. Zonder dit gebruik je gewoon een rekenmachine in een vacuüm. In de programmeertaal C is scanf het werkpaard voor het ophalen van gegevens van het toetsenbord. Het is eenvoudig. Het is overal. Maar het is ook berucht omdat het meedogenloos is als er iets misgaat.
Voor basisscripts of snelle prototypes doet scanf het werk. Het leest van stdin (standaardinvoer). Als je op een toetsenbord typt, komen je personages daar terecht. De functie is veelzijdig, maar mist een robuuste foutafhandeling. Het maakt niet uit of u een letter typt terwijl er een cijfer wordt verwacht. Het zal daar gewoon blijven zitten, of erger nog, uw programma laten crashen. Daarom is het geweldig voor eenvoudige taken, maar slecht voor productiesoftware.
De syntaxis en het ampersand
Laten we eens kijken naar de eenvoudigst mogelijke gebruikssituatie. Je wilt een geheel getal. Je vraagt erom. Je bewaart het.
scanf("%d", &b);
Dat is alles. Twee argumenten. De indelingsreeks en het doel.
De %d vertelt scanf dat hij een geheel getal moet verwachten. Het is dezelfde tijdelijke aanduiding die u gebruikt in printf. De variabele b moet worden gedeclareerd als een int. Als dat niet het geval is, vraag je om problemen.
Hier is het gedeelte waar beginners elke keer over struikelen: het ampersand (& ).
‘&b’ is geen typefout. Het is een aanwijzer. Concreet is dit het adres van de variabele b. scanf neemt de waarde niet aan; het heeft de geheugenlocatie nodig om de invoer naar te schrijven. Vergeet de ‘&’. Uw code kan worden gecompileerd. Maar wanneer voer je het uit? Crash. Segfout. Leegte. Het programma zal vrijwel zeker abrupt eindigen omdat het naar een willekeurig geheugenadres probeert te schrijven.
Vlaggen opmaken
scanf gebruikt dezelfde conversiespecificaties als printf. Als je de een kent, ken je de ander. Maar de context is belangrijk.
- Gehele getallen :
%d - Getallen met drijvende komma :
%f - Enkele tekens :
%c - Strings :
%s
Houd ze recht. Verwissel een %f voor een geheel getal en je krijgt rommelgegevens of een crash.
Waarom scanf niet genoeg is
Je kan scanf -oproepen aan elkaar koppelen om meerdere waarden te lezen.
Dit werkt voor cijfers. Het is schoon genoeg. Maar probeer eens een volledige regel tekst te lezen? Het breekt. scanf met %s stopt bij de eerste witruimte. Het leest niet de hele regel. En het kan bufferoverflows niet veilig verwerken.
Voor echte programma’s moet u scanf voor tekstinvoer vermijden. Gebruik in plaats daarvan gets (wat verouderd en gevaarlijk is) of, bij voorkeur, fgets. Deze functies lezen regel voor regel in een buffer. Zodra u de regel heeft, kunt u deze parseren. U kunt controleren op fouten. U kunt valideren dat de invoer op een getal lijkt voordat u deze probeert te converteren. scanf slaat deze stap over. Het gaat ervan uit dat je weet wat je doet. Meestal niet.
Dingen met opzet kapot maken
De beste manier om C te leren is niet door documentatie te lezen. Het is door de compiler te verbreken.
Neem dit fragment:
Wijzig het. Maak het nog erger.
Verwijder b uit de variabelendeclaratie. Kijk hoe de compiler schreeuwt over een ongedefinieerde variabele.
Verwijder een puntkomma. Kijk hoe de syntaxisfout zich verspreidt.
Verwijder een beugel. Kijk hoe de parser gek wordt.
Verwijder een haakje. Observeer de verwarring




































