PDA

View Full Version : เล็กน้อยเกี่ยวกับการใช้ scanf และ gets ในภาษาC



Mikieball3
16-10-2007, 06:47 PM
รู้สึกว่า ในภาษา C ถ้าใช้ scanf แล้วตามด้วย gets จะทำให้เกิด Bug เนื่องจาก gets ตัวที่ตามหลัง scanf ทันที
จะไม่ทำงาน และจะไปทำงานในขั้นตอนต่อไปทันที ยังไม่ทราบเหตุผลแน่ชัด แต่คาดว่า เป็นเพราะ scanf เป็นการ
Input ข้อมูล และเมื่อ scanf อีกครั้ง มันจะ Out ก่อน แล้วค่อย Input ใหม่ แต่ gets กับ scanf ไม่ Support
กัน และ gets ไม่ได้ทำการ Out ก่อน จึง Input ไม่ได้(มั้งคะ)...

วิธีแก้เบื้องต้น: ใส่ fflush(stdin); เข้าไปก่อนที่จะทำการ gets...ต่อจาก scanf...... ค่ะ

หวังว่าจะมีประโยชน์นะคะ

Karun
22-01-2008, 10:10 PM
สาเหตุที่ ทำให้ gets ไม่ทำงานเพราะว่า
**Hidden Content: Check the thread to see hidden data.**

จบข่าว... :D :P

ฺBackSpace
22-02-2008, 11:41 PM
ผมเคยเป็นครับ ตอนเรียน

อาจารย์แนะนำวิธีแก้แบบง่ายๆ

ให้ใส่้เป็น gets() 2 อันอะคับ

อันแรกที่ต่อจาก scanf อาจจะเป็นว่างไว้หรือไม่ก็ตัวแปรที่จะนำไปใช้

อันหลังจึงใส่ตัวแปรที่จะนำไปใช้ ให้ข้อมูลทับตัวแรกไปเลย

ผมก็ไม่รู้จะมีผลข้างเคียงรึป่าวนะคับ แต่เห็นว่าง่ายดีอะ

zolaman
09-05-2008, 01:37 AM
กระจ่างในทันที

กำลังเขียนโปรอยู่ มาเซิทหาใน Google เจอเลย

ถ้าไม่เจอ คง งง ไปอีก ซักพัก

clashone
23-05-2008, 05:45 PM
คือยากทราบว่าที่ gets()ตัวที่ต่อจาก scanf ได้รับ คือ \n หรือ enter หรือ ขี้นบรรทัดใหม่ป่าวครับ

อยากรู้มานานแล้วช่วยหอบหน่อยครับ

IamSo
12-12-2008, 02:55 PM
ผมว่าไม่น่ะครับ

singha.osot
15-12-2008, 06:19 PM
ปัญหานี้ พบอยู่ตลอดครับ

ที่เมื่อใช้ scanf() แล้ว จะมี \n หรือ Enter ตกค้างอยู่

ผมขอเสนอวิธีนี้ครับ ผมคิดว่า เป็นวิธีที่ง่ายๆ


ตัวอย่างเช่น

ต้องการรับ Input เป็น string 1 ชุด และ ตามด้วย จำนวนเต็ม อีก 2 ตัว

การ Call Function scanf() ทั่วไป ก็จะออกมาในลักษณะนี้

scanf("%s%d%d",varString,&varInt1,&varInt2);

เมื่อนำโปรแกรมไปใช้งานจริง สิ่งที่ผู้ใช้จะป้อนเข้ามา ก็จะเป็น

samplestring 4 5\n

เพราะ เมื่อผู้ใช้กรอก Input ครบ จะต้อง กด Enter ทำให้รับ \n เข้ามา

เราจะแก้ด้วยการ ใส่ %*c เข้าไป ดังนี้

scanf("%s%d%d%*c",varString,&varInt1,&varInt2);

ซึ่งถ้าพูดติดตลกก็คือ การปล่อยให้ %*c รับ วิญญาณของ \n เข้ามา ไม่ให้ตกค้าง
แล้วเราก็ไม่ได้เก็บค่า \n ไปประมวลผลอะไร

วิธีนี้เป็นวิธีที่ผมใช้แล้วไม่มีปัญหา ในการทำโจทย์แข่งขัน
ซิ่ง มี Data set ที่ส่งเข้ามาแน่นอน
ไม่มีการใส่ค่า แปลกประหลาดอย่าง เช่น เว้นวรรคไปร้อยตัวเล่นๆหลังจากใส่ input ตัวสุดท้าย