Hoe gebruikersinvoer in C te lezen met scanf

5

Constanten zijn handig. Ze zijn statisch. Maar ze zijn ook saai.

Een programma dat altijd 5 en 7 optelt, doet precies één ding. Het past zich niet aan. Het heeft geen interactie. Om C-code daadwerkelijk nuttig te maken voor eindgebruikers, moet u stoppen met het hardcoderen van waarden en beginnen met luisteren.

Het hulpmiddel voor deze taak is scanf.

Van hardgecodeerd naar dynamisch

In het vorige voorbeeld waren de variabelen ‘a’ en ‘b’ waarschijnlijk geïnitialiseerd met vaste getallen. De logica was rigide. De opbrengst was voorspelbaar. Als je de toevoeging wilde wijzigen, moest je de broncode bewerken, opnieuw compileren en opnieuw uitvoeren.

Dat is niet gebruiksvriendelijk.

Om dit op te lossen, moeten we invoer van de console vastleggen. De standaardbibliotheek verwerkt zowel de uitvoer (printf ) als de invoer (scanf ). De verschuiving van constanten naar door de gebruiker gedefinieerde waarden verandert het programma van een rekenmachinedemo in een eenvoudig hulpprogramma.

De scanf-syntaxis

Hier is de code die ervoor zorgt dat dit gebeurt:

De logica is eenvoudig. Het is lineair.

  1. Het programma vraagt ​​om het eerste gehele getal.
  2. scanf wacht op invoer.
  3. De gebruiker typt een getal en drukt op Enter.
  4. De waarde wordt opgeslagen in a.
  5. Herhaal dit voor b.
  6. Voeg ze toe.
  7. Druk het resultaat af.

De Ampersand (&) verwarring

Het meest voorkomende faalpunt voor beginners hier is het & -symbool.

Kijk naar deze regel:
scanf("%d", &a);

Waarom is er een ampersand? Waarom niet gewoon scanf("%d", a);?

Variabelen in C zijn niet alleen namen. Het zijn geheugenadressen. Wanneer u int a declareert, reserveert u een stuk RAM. scanf wil de waarde van a niet omdat a momenteel leeg is (of rommel bevat). scanf heeft het adres nodig waar het de nieuwe waarde kan schrijven.

De & is de operator “adres-van”. Het geeft scanf de locatie in het geheugen zodat het a direct kan wijzigen. Zonder dit wijs je scanf naar een willekeurig stukje geheugen. Het programma zal waarschijnlijk crashen, of erger nog, uw gegevens beschadigen.

Belangrijk inzicht: printf gebruikt de waarde. scanf heeft het adres nodig.

Formaatspecificaties

Je hebt %d in printf gebruikt om een geheel getal weer te geven. Je moet %d in scanf gebruiken om er één te lezen.

Als deze niet op elkaar aansluiten, ontstaat ongedefinieerd gedrag. Als u een geheel getal probeert te lezen met behulp van %f (float), zullen de gegevens onjuist worden geïnterpreteerd. De geheugenindeling van een float verschilt van die van een geheel getal. scanf zal de onbewerkte stukjes van een float schrijven

Hoe scanf en printf omgaan met variabelen in C

Bij het compileren en uitvoeren van de code komen theorie en werkelijkheid samen. Als u deze stap overslaat, is het slechts een gok. De functie scanf werkt op dezelfde manier als printf wat betreft formaatreeksen, maar er gelden strengere invoervereisten. U moet de adresoperator (& ) vóór variabelen van het type char, int, float en structuren plaatsen. Zonder dit crasht het programma.

Waarom scanf de adresoperator vereist

Het ampersand is niet optioneel. Het vertelt de compiler om de invoer rechtstreeks op te slaan in de geheugenlocatie van de variabele. Als u dit weglaat, activeert u een runtimefout. Je moet proberen het opzettelijk te verwijderen. Het zien van de crash is leerzamer dan erover lezen. Het laat precies zien hoe kwetsbaar C kan zijn als geheugenadressen verkeerd worden beheerd.

Hoe printf de uitvoer voor gebruikers formatteert

printf stuurt tekst naar standaarduitvoer. De eenvoudigste versie ziet er als volgt uit:

Hierdoor wordt het woord “Hallo” afgedrukt zonder nieuwe regel. Vergelijk dat met:

De \n voegt een harde return toe. Het maakt een einde aan de lijn. Zonder dit verschijnt de volgende uitvoer op dezelfde regel. Het is een klein detail dat de leesbaarheid verpest als het wordt genegeerd.

Variabelen insluiten in printf-strings

Om de waarde van een variabele uit te voeren, gebruikt u een tijdelijke aanduiding. De %d operator vervangt zichzelf door de gehele waarde van de variabele. Beschouw dit voorbeeld:

Je kunt afzonderlijke printf -aanroepen aan elkaar koppelen om tekst en variabelen te combineren, maar dit is inefficiënt:

Bij de schonere aanpak wordt de tijdelijke aanduiding in de tekenreeks ingebed:

Meerdere tijdelijke aanduidingen werken ook:

Het aantal tijdelijke aanduidingen moet exact overeenkomen met het aantal variabelen. Typen moeten ook overeenkomen. Drie %d -specificaties vereisen drie int -parameters in dezelfde volgorde. Niet-overeenkomende typen of tellingen leiden tot ongedefinieerd gedrag.

Welke tijdelijke aanduidingen verwerken verschillende C-typen

printf ondersteunt standaard C-typen via specifieke formaatspecificaties:

  • int gebruikt %d
  • float gebruikt %f
  • char gebruikt %c
  • tekenreeksen gebruiken %s

U kunt gedetailleerde documentatie vinden door man 3 printf te typen op een UNIX-machine. Andere compilers bieden vergelijkbare handleidingen of helpbestanden.

Veelvoorkomende C-fouten die u moet vermijden

Hoofdlettergevoeligheid is strikt. Printf of PRINTF zal mislukken. Het moet een kleine letter ‘printf’ zijn.

  • Het vergeten van de & in scanf veroorzaakt runtime-crashes.
  • Niet-overeenkomende parametertellingen in printf of scanf beschadigen de uitvoer.
  • Het gebruik van niet-gedeclareerde variabelen resulteert in compilatiefouten.

Het debuggen van deze problemen komt vaak neer op het eerst controleren van de syntaxis. De compiler zal u meestal precies vertellen waar de mismatch ligt. Je hoeft alleen maar de foutmelding te lezen.