1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> ลำโพง 1: ลองเขียนโปรแกรมที่ ได้รับสายจากผู้ใช้โดยไม่ต้อง 3 00:00:02,920 --> 00:00:05,700 ใช้ CS50 ห้องสมุด GetString ฟังก์ชั่น 4 00:00:05,700 --> 00:00:08,720 การทำเช่นนี้เราจะไปข้างหน้าและใช้ scanf ฟังก์ชั่นที่ GetString 5 00:00:08,720 --> 00:00:10,950 ฟังก์ชั่นการใช้จริง ภายใต้กระโปรงหน้ารถ 6 00:00:10,950 --> 00:00:13,780 แต่ฉันจะทำเช่นนี้จงใจ ในทางรถ 7 00:00:13,780 --> 00:00:17,230 ฉันจะทำในทางที่ผมคิดว่า จะเป็นที่ถูกต้อง แต่มันกลับกลายเป็นว่า 8 00:00:17,230 --> 00:00:19,380 สมมติฐานของฉันไป เป็นค่อนข้างสมบูรณ์ทีเดียว 9 00:00:19,380 --> 00:00:20,800 และในความเป็นจริงอันตรายมาก 10 00:00:20,800 --> 00:00:24,750 เพราะข้อบกพร่องอย่างหนึ่งที่ฉันจะ ทำให้สามารถใช้ประโยชน์โดยฝ่ายตรงข้าม 11 00:00:24,750 --> 00:00:28,870 ดังกล่าวว่าเครื่องหรือโปรแกรมของคุณ สามารถนำไปที่อาจเกิดขึ้น 12 00:00:28,870 --> 00:00:30,200 >> ขอเริ่มต้นดังต่อไปนี้ 13 00:00:30,200 --> 00:00:33,540 ก่อนขอประกาศสตริงของเรา หรือที่เรียกว่าเป็นดาวถ่าน, 14 00:00:33,540 --> 00:00:34,750 และเรียกมัน 15 00:00:34,750 --> 00:00:39,400 ช่วยให้ต่อไปแจ้งให้ผู้ใช้สตริงที่ เช่นเดียวกับสตริง "โปรด". และ 16 00:00:39,400 --> 00:00:44,250 ตอนนี้ขอได้รับสายจากผู้ใช้ ใช้ scanf พูดได้นำมาอ้าง "% s." ใน 17 00:00:44,250 --> 00:00:47,760 คำอื่น ๆ ที่ขอแจ้ง scanf เราว่า ในความเป็นจริงไม่คาดหวังที่จะได้รับสาย 18 00:00:47,760 --> 00:00:48,630 จากผู้ใช้ 19 00:00:48,630 --> 00:00:50,810 >> แต่ตอนนี้เราจำเป็นต้องบอก scanf สิ่งหนึ่ง ๆ - 20 00:00:50,810 --> 00:00:53,350 ที่จะนำสตริงที่ ผู้ใช้ให้ 21 00:00:53,350 --> 00:00:57,840 ดีฉันจะค่อนข้างเพียงแค่เริ่มต้น ด้วยเครื่องหมายจุลภาค s ระบุว่าฉันต้องการ 22 00:00:57,840 --> 00:00:59,320 scanf จะนำสตริงมี 23 00:00:59,320 --> 00:01:04,818 ฉันต่อไปจะพิมพ์ออกมาบางสิ่งบางอย่าง เช่น printf "ขอบคุณสำหรับ% s 24 00:01:04,818 --> 00:01:10,670 เครื่องหมายจุลภาค n. "และเช่นเคยผม จะผ่านในสตริง, s 25 00:01:10,670 --> 00:01:14,920 ตอนนี้ขอบันทึกรวบรวมและใช้นี้ โปรแกรมและดูว่าเราไม่สามารถทำให้เกิดการ 26 00:01:14,920 --> 00:01:16,590 ปัญหาที่ผมคาดการณ์ไว้ 27 00:01:16,590 --> 00:01:18,650 >> ทำให้ scanf-1 28 00:01:18,650 --> 00:01:20,960 ./scanf-1 29 00:01:20,960 --> 00:01:21,830 String โปรด 30 00:01:21,830 --> 00:01:25,540 ขอให้สิ่งที่ต้องการ "สวัสดี". "ขอบคุณสำหรับ null." อืมที่ไม่ 31 00:01:25,540 --> 00:01:26,750 สิ่งที่ผมคาดหวังว่า 32 00:01:26,750 --> 00:01:28,240 ดังนั้นสิ่งที่เกิดขึ้นที่นี่ 33 00:01:28,240 --> 00:01:32,040 >> ดีก็จะเปิดออกเพราะเราประกาศ ในฐานะดาวถ่าน แต่เราไม่ได้ 34 00:01:32,040 --> 00:01:36,120 จัดเก็บจริงในที่อยู่ของ ก้อนที่เกิดขึ้นจริงของหน่วยความจำ scanf ไม่ได้ 35 00:01:36,120 --> 00:01:38,940 มีที่ใดก็ได้ที่จะวางสาย ที่ผู้ใช้พิมพ์ค่ะ 36 00:01:38,940 --> 00:01:42,510 อันที่จริงหากผู้ใช้จะพิมพ์ได้ในตอนนี้ สตริงนานกว่า "สวัสดี" 37 00:01:42,510 --> 00:01:46,780 ตัวอย่างเช่นหลายบรรทัดของข้อความหรือ หลายย่อหน้าของข้อความก็ค่อนข้าง 38 00:01:46,780 --> 00:01:50,280 เป็นไปได้ว่าเราอาจจะก่อให้เกิดการ เรียกว่าความผิดส่วน 39 00:01:50,280 --> 00:01:53,570 >> เพราะ scanf จะไม่ทราบว่า ผมยังไม่ได้ใส่จริงที่อยู่ 40 00:01:53,570 --> 00:01:54,610 ภายในของส 41 00:01:54,610 --> 00:01:58,000 แต่ก็จะไปดูค่าบางอย่าง ในวินาที, รูปแบบของบางชิ้นที่อาจ 42 00:01:58,000 --> 00:02:00,910 ดีมากเป็นค่าขยะ มีเพียงแค่โอกาส 43 00:02:00,910 --> 00:02:04,600 scanf และยังจะพยายามที่จะเขียน สตริงผู้ใช้ไปยังที่อยู่ที่ 44 00:02:04,600 --> 00:02:08,789 แม้ว่าจะเป็นค่าขยะซึ่ง แน่นอนอาจทำให้เกิดความผิดพลาด 45 00:02:08,789 --> 00:02:10,130 >> ดังนั้นเราจึงมีวิธีการที่จะแก้ไขปัญหานี้ 46 00:02:10,130 --> 00:02:12,523