Hoe gebruikersinvoer in C te lezen met scanf

15

Constanten zijn rigide. Ze veranderen niet. Zo is het leven niet, en dat zouden je testprogramma’s ook niet moeten zijn. Als je C leert, wordt het hardcoderen van getallen zoals 5 en 7 snel oud. Je wilt interactie. U wilt dat de computer wacht tot u iets typt.

Voer ‘scanf’ in.

Het is de andere helft van het ‘printf’-verhaal. Terwijl printf gegevens naar het scherm pusht, haalt scanf gegevens van het toetsenbord. Het is niet de meest robuuste tool in de C-standaardbibliotheek, maar voor eenvoudige console-invoer wordt de klus geklaard zonder dat er een afhankelijkheid van derden nodig is.

Hier leest u hoe u een statisch script dynamisch maakt.

De code

Kopieer dit. Voer het uit. Typ cijfers wanneer daarom wordt gevraagd.

scanf uitsplitsen

De magie gebeurt in deze twee regels:

scanf("%d", &a);

  • scanf : De functienaam. Afkorting van ‘scan-geformatteerde invoer’.
  • "%d" : De formaatspecificatie. Het vertelt scanf dat hij een geheel getal moet verwachten. Als u een float zou lezen, zou u "%f" gebruiken.
  • &a : Dit is het cruciale deel. Je geeft de waarde van a niet door. U geeft het adres van a door.

Zie het op deze manier: printf moet weten wat er in de variabele zit. scanf moet weten waar de gegevens moeten worden geplaatst. De & operator levert dat geheugenadres op. Sla het ampersand over en je crasht. Of erger nog, u krijgt een waarschuwing die op wartaal lijkt en een variabele die niet verandert.

Hoe het in de praktijk werkt

Wanneer u het programma uitvoert:

  1. De terminal drukt af: Voer de eerste waarde in:
  2. De cursor knippert. Het wacht. Je zit hier vast totdat je iets typt en op Enter drukt.
  3. Je typt 5. Je drukt op Enter.
  4. scanf pakt die 5, converteert de reeks tekens “5” naar de gehele waarde 5, en slaat deze op in het geheugenadres &a.
  5. Dezelfde lus vindt plaats voor de tweede waarde.

Dan komt de wiskunde. c = a + b;. Eenvoudige toevoeging.

Ten slotte geeft printf het resultaat weer. Maar let op de formatstring: printf("%d + %d = %d\n", a, b, c);. Je injecteert de variabelen terug in de string. Zo creëer je leesbare output.

Waarom dit belangrijk is

De meeste moderne applicaties gebruiken geen console-invoer. U typt geen opdrachten in een zwarte doos voor uw webbrowser of uw foto-editor. Maar het begrijpen van deze stroom is fundamenteel.

Invoer -> Proces -> Uitvoer.

Dat is de basislus van alle software. `

Hoe scanf omgaat met geheugenadressen

Wanneer u deze code uitvoert, komt het verschil tussen succes en een runtime-crash neer op één teken. In het bijzonder het ampersand (& ) vóór de variabelen a en b.

Dit is de adresoperator. Het vertelt scanf precies waar in het geheugen de ontvangen invoer moet worden opgeslagen. Zonder dit kent scanf de locatie van de variabele niet. Het krijgt gewoon een waarde, die nutteloos is voor het opslaan van gegevens in het programma. Als u dit weglaat, zal het programma niet compileren of onmiddellijk na uitvoering crashen. U hebt deze operator nodig voor de typen char, int, float en structuur.

Probeer het te verwijderen. Kijk wat er gebeurt. Het is een pijnlijke maar noodzakelijke les in hoe C het geheugen beheert.

Printf-uitvoer beheersen

printf is uw venster voor de gebruiker. Het verzendt gegevens naar standaarduitvoer. De eenvoudigste versie is eenvoudig.

Hierdoor wordt het woord Hallo afgedrukt. Niets anders. Geen regeleinde. De cursor blijft direct na de ‘o’ staan.

Voeg een newline-teken toe.

Nu gaat de uitvoer naar de volgende regel. De \n is een harde return. Het is essentieel voor leesbare console-uitvoer.

Variabelen veranderen het spel. Je kunt niet zomaar een variabelenaam afdrukken zoals in Python of JavaScript. U moet een tijdelijke aanduiding gebruiken.

De %d is een tijdelijke aanduiding. Het wordt tijdens runtime vervangen door de gehele waarde van b. Dit is hoe C omgaat met dynamische uitvoer.

U kunt tekst en variabelen combineren. Een onhandige manier is het aan elkaar koppelen van meerdere afdrukken.

Het werkt. Het is ook uitgebreid. De schonere aanpak integreert alles in één string.

Meerdere waarden werken ook. Zorg ervoor dat de tijdelijke aanduidingen op één lijn liggen met de argumenten.

De volgorde is belangrijk. De eerste %d wordt toegewezen aan a. De tweede tot ‘b’. De derde tot c. Als je ze verwisselt, klopt de wiskunde niet. Als u er een mist, is het gedrag ongedefinieerd. Het aantal en type operators in de formatstring moeten exact overeenkomen met de parameters.

Typespecifieke tijdelijke aanduidingen

C is streng wat betreft typen. U kunt niet voor alles dezelfde tijdelijke aanduiding gebruiken. U moet het gegevenstype afstemmen op de formaatspecificatie.

  • Gebruik %d voor int (gehele getallen).
  • Gebruik %f voor float (zwevende-kommagetallen).
  • Gebruik %c voor char (enkele tekens).
  • Gebruik %s voor tekenreeksen (arrays van tekens).

Als je %d gebruikt voor een float, krijg je een rommeluitvoer. Als u %s gebruikt voor een int, crasht het programma waarschijnlijk. Precisie is hier niet optioneel.

Raadpleeg de UNIX-handleiding voor meer informatie over deze specificaties. Typ ‘man 3 printf’. Andere compilers bieden soortgelijke documentatie. Het is de moeite waard om te lezen.

Veel voorkomende valkuilen die u moet vermijden

C-compilers zijn nuttig, maar ze zijn geen gedachtenlezers. Je zult fouten maken. Hier leest u hoe u de meest voorkomende kunt vermijden.

  1. Hoofdlettergevoeligheid : C is hoofdlettergevoelig. Printf of PRINTF zal mislukken. Het moet ‘printf’ zijn. Hetzelfde geldt voor namen van variabelen en functieaanroepen.
  2. De adresoperator ontbreekt : het vergeten van de & in scanf is een veel voorkomende fout. Het veroorzaakt een onmiddellijke runtime-fout. Neem dit altijd op voor primitieve typen.
  3. Niet-overeenkomende parameters : te veel of te weinig argumenten in printf of scanf leiden tot fouten. De formatstring bepaalt de structuur. Houd je eraan.
  4. Niet-gedeclareerde variabelen : u moet een variabele declareren voordat u deze gebruikt. C leidt geen typen af. U definieert int a; voordat u a kunt afdrukken.

Deze fouten herhalen zich. Ze zijn ook gemakkelijk te repareren als je het patroon eenmaal herkent.