揚聲器1:讓我們一起來看看 在CS50庫, 特別是其調用getInt功能。 在這裡,我們有實際的源 對於調用getInt代碼。 並請注意,這不是時間太長, 其中大部分是構成一個while循環 - 無限循環在那 - 只有 返回一個值,一旦我們實際上已經 得到我們所期待的。 讓我們通過它。 請注意,在這裡第一, while循環開始。 注意接下來我們有一個行代碼 這實際上是調用GetString的, 和存儲在返回值 變量,叫做string類型的線,。 然後,我們做的有點完整性檢查。 如果行== null,那麼我們好奇地 返回INT_MAX。 現在,事實證明,INT_MAX是一個 特殊常量聲明別處 指定的最大可能 INT,你可以在一個代表 程序是這樣的。 現在我們已經擅自決定返回 INT_MAX作為一個哨兵值 各種各樣的,一個我們已經保留作為 這意味著一個錯誤已經發生。 因此,我們付出的代價,當然是 該調用getInt顯然可以不 實際上返回一個數字一樣大 INT_MAX,因為即使它想, 該返回值應該真的 由調用者解釋 - 誰是使用調用getInt - 作為某種錯誤。 接下來,請注意,我已經聲明 一個int n和一個char角 在這個代碼下一行,我所說的 函數調用sscanf的,在傳遞 四個參數。 線,這是字符串的用戶的 類型中,“%I%c”的,這是一個格式 字符串,我期待的用戶可能 類型,隨後的地址 n和C的地址。 在現在的生活的sscanf的目的確實是 掃描一個串尋找的 特定的格式,程序員 已指定為第二個參數。 在這種情況下,%i是 還有,因為是%C。 所以,如果遇到的sscanf在一個int 用戶的輸入,該整數將被存儲 稱為n變量,裡面因為 我們已提供作為第三 參數的sscanf n的地址。 這意味著sscanf的,的確可以去 在那裡,並在其中更新值。 現在,如果用戶鍵入 在更多的東西 比一個或多個數字 - 換句話說,某種類型的字符 - 那第二個變量c​​,其地址 我們傳入的sscanf作為其第四 參數也將被填充。 現在檢查的的上攻 從用戶額外的字符是 如果他或她不配合, 並在不止一個int類型, 我們就可以檢測到它在這 方式,因為在這種情況下,sscanf的 將要返回2,表示 無論是佔位符填充 與值。 但我們希望sscanf的,而不是 返回1,這只能意味著用戶 提供一個int。 我們該怎麼辦,如果sscanf的 的確返回1? 好了,我們立即釋放行 用戶鍵入的,然後我們 立即返回N,有 得到一個int。 否則,如果sscanf的不返回1,並 用戶因此不配合, 我們仍然可以自由線,但我們 現在提示重試用戶。 而且因為我們仍然是內 否則無限循環,該過程 將重新開始,也許又和 或許再次,用戶實際上直到 為我們提供了一個int。