2 00:00:00,000 --> 00:00:01,860 >> 揚聲器1:讓我們一起來看看 在CS50庫, 3 00:00:01,860 --> 00:00:05,190 特別是其調用getInt功能。 4 00:00:05,190 --> 00:00:07,820 在這裡,我們有實際的源 對於調用getInt代碼。 5 00:00:07,820 --> 00:00:12,050 並請注意,這不是時間太長, 其中大部分是構成一個while循環 - 6 00:00:12,050 --> 00:00:15,620 無限循環在那 - 只有 返回一個值,一旦我們實際上已經 7 00:00:15,620 --> 00:00:17,400 得到我們所期待的。 8 00:00:17,400 --> 00:00:18,700 讓我們通過它。 9 00:00:18,700 --> 00:00:21,650 >> 請注意,在這裡第一, while循環開始。 10 00:00:21,650 --> 00:00:25,390 注意接下來我們有一個行代碼 這實際上是調用GetString的, 11 00:00:25,390 --> 00:00:29,620 和存儲在返回值 變量,叫做string類型的線,。 12 00:00:29,620 --> 00:00:31,210 然後,我們做的有點完整性檢查。 13 00:00:31,210 --> 00:00:35,770 如果行== null,那麼我們好奇地 返回INT_MAX。 14 00:00:35,770 --> 00:00:40,140 >> 現在,事實證明,INT_MAX是一個 特殊常量聲明別處 15 00:00:40,140 --> 00:00:44,030 指定的最大可能 INT,你可以在一個代表 16 00:00:44,030 --> 00:00:45,160 程序是這樣的。 17 00:00:45,160 --> 00:00:49,430 現在我們已經擅自決定返回 INT_MAX作為一個哨兵值 18 00:00:49,430 --> 00:00:53,120 各種各樣的,一個我們已經保留作為 這意味著一個錯誤已經發生。 19 00:00:53,120 --> 00:00:56,230 因此,我們付出的代價,當然是 該調用getInt顯然可以不 20 00:00:56,230 --> 00:01:01,440 實際上返回一個數字一樣大 INT_MAX,因為即使它想, 21 00:01:01,440 --> 00:01:04,730 該返回值應該真的 由調用者解釋 - 22 00:01:04,730 --> 00:01:06,260 誰是使用調用getInt - 23 00:01:06,260 --> 00:01:09,340 作為某種錯誤。 24 00:01:09,340 --> 00:01:13,840 >> 接下來,請注意,我已經聲明 一個int n和一個char角 25 00:01:13,840 --> 00:01:18,030 在這個代碼下一行,我所說的 函數調用sscanf的,在傳遞 26 00:01:18,030 --> 00:01:18,970 四個參數。 27 00:01:18,970 --> 00:01:25,110 線,這是字符串的用戶的 類型中,“%I%c”的,這是一個格式 28 00:01:25,110 --> 00:01:28,850 字符串,我期待的用戶可能 類型,隨後的地址 29 00:01:28,850 --> 00:01:30,920 n和C的地址。 30 00:01:30,920 --> 00:01:34,860 在現在的生活的sscanf的目的確實是 掃描一個串尋找的 31 00:01:34,860 --> 00:01:38,700 特定的格式,程序員 已指定為第二個參數。 32 00:01:38,700 --> 00:01:42,020 在這種情況下,%i是 還有,因為是%C。 33 00:01:42,020 --> 00:01:46,700 所以,如果遇到的sscanf在一個int 用戶的輸入,該整數將被存儲 34 00:01:46,700 --> 00:01:50,270 稱為n變量,裡面因為 我們已提供作為第三 35 00:01:50,270 --> 00:01:52,810 參數的sscanf n的地址。 36 00:01:52,810 --> 00:01:56,870 這意味著sscanf的,的確可以去 在那裡,並在其中更新值。 37 00:01:56,870 --> 00:01:59,990 >> 現在,如果用戶鍵入 在更多的東西 38 00:01:59,990 --> 00:02:01,220 比一個或多個數字 - 39 00:02:01,220 --> 00:02:03,570 換句話說,某種類型的字符 - 40 00:02:03,570 --> 00:02:07,940 那第二個變量c​​,其地址 我們傳入的sscanf作為其第四 41 00:02:07,940 --> 00:02:10,560 參數也將被填充。 42 00:02:10,560 --> 00:02:14,220 現在檢查的的上攻 從用戶額外的字符是 43 00:02:14,220 --> 00:02:17,360 如果他或她不配合, 並在不止一個int類型, 44 00:02:17,360 --> 00:02:20,530 我們就可以檢測到它在這 方式,因為在這種情況下,sscanf的 45 00:02:20,530 --> 00:02:24,860 將要返回2,表示 無論是佔位符填充 46 00:02:24,860 --> 00:02:25,600 與值。 47 00:02:25,600 --> 00:02:30,360 但我們希望sscanf的,而不是 返回1,這只能意味著用戶 48 00:02:30,360 --> 00:02:31,630 提供一個int。 49 00:02:31,630 --> 00:02:34,480 >> 我們該怎麼辦,如果sscanf的 的確返回1? 50 00:02:34,480 --> 00:02:39,150 好了,我們立即釋放行 用戶鍵入的,然後我們 51 00:02:39,150 --> 00:02:42,670 立即返回N,有 得到一個int。 52 00:02:42,670 --> 00:02:47,180 否則,如果sscanf的不返回1,並 用戶因此不配合, 53 00:02:47,180 --> 00:02:51,470 我們仍然可以自由線,但我們 現在提示重試用戶。 54 00:02:51,470 --> 00:02:55,390 而且因為我們仍然是內 否則無限循環,該過程 55 00:02:55,390 --> 00:03:00,190 將重新開始,也許又和 或許再次,用戶實際上直到 56 00:03:00,190 --> 00:03:01,500 為我們提供了一個int。 57 00:03:01,500 --> 00:03:21,490