LUIDSPREKER 1: Laten we eens een kijkje nemen op CS50 bibliotheek specifiek zijn getInt functie. Hier hebben we de werkelijke bron code voor getint. En merk op dat het niet te lang, en het grootste deel vormt een tijdje loop - een oneindige lus dat - dat slechts geeft een waarde zodra we hebben eigenlijk gekregen wat we verwacht hadden. Laten we er doorheen lopen. Let hier eerst, de while loop begint. Merk vervolgens op dat we een regel code dat eigenlijk noemt GetString, en slaat de return waarde in een variabele, genaamd lijn, van het type string. We doen dan een beetje een sanity check. Als lijn == null, dan merkwaardig we terug INT_MAX. Nu blijkt dat INT_MAX is een speciale constante elders verklaard dat de grootst mogelijke specificeert int dat u in een kan vertegenwoordigen programma als dit. Nu hebben we willekeurig besloten om terug te keren INT_MAX als een sentinel waarde van soorten, een die we hebben gereserveerd als wat betekent dat er een fout is opgetreden. Dus de prijs die we betalen, is natuurlijk dat getInt kan blijkbaar niet eigenlijk terug een aantal zo groot INT_MAX, want zelfs als het wil, die return waarde moet echt worden geïnterpreteerd door de beller - wie is het gebruik van getint - als een fout van een soort. Vervolgens merken dat ik heb verklaard een int n en een char c. In deze volgende regel code, noem ik een functie genaamd sscanf, passeren in vier argumenten. lijn, welke de tekenreeks de gebruiker getypt, "% i% c", hetgeen een formaat string die ik verwacht de gebruiker macht type, gevolgd door het adres n, en het adres van c. Nu sscanf's doel in het leven is inderdaad om een ​​string op zoek naar de scan bepaald formaat dat de programmeur heeft opgegeven als dat tweede argument. In dit geval,% i in daar, zoals% c. Dus als sscanf tegenkomt een int in de ingangsdeelnemer, zal dat int opgeslagen binnenzijde van de variabele genaamd n, omdat heeft geleverd als derde argument aan het adres van n sscanf. Wat betekent dat sscanf inderdaad kunnen gaan daar, en daarin werk de waarde. Nu, wanneer de gebruiker typt in iets meer dan een of meer cijfers - met andere woorden, een residu van een soort - die tweede variabele c, waarvan het adres we overgegaan in sscanf als vierde argument wordt ook bevolkt. Nu de kop van het controleren van een aanvullende karakter van de gebruiker is dat als hij of zij niet meewerkt, en soorten in meer dan alleen een int, we in staat zijn om het te ontdekken in deze wijze, omdat in dat geval, sscanf gaat terug 2, betekent dat zowel van de tijdelijke aanduidingen werden gevuld met waarden. Maar we hopen dat sscanf plaats retourneert 1, die alleen de gebruiker betekent mits een int. Wat doen we als sscanf inderdaad geeft 1? Nou, we vrij direct de lijn die de gebruiker ingetypt, en dan hebben we onmiddellijk terug te keren n, met gekregen een int. Want indien sscanf niet terugkeert 1, en de gebruiker dus geen medewerking, we vrij nog steeds de lijn, maar we Nu vraagt ​​de gebruiker om opnieuw te proberen. En omdat we nog steeds binnen van die anders oneindige lus, het proces zal weer opnieuw beginnen, en misschien, en misschien weer, totdat de gebruiker daadwerkelijk geeft ons een int.