ช่วงนี้ผมก็ทำงาน Project ส่งงานวิชา Unix เสร็จเป็นที่เรียบร้อย แล้วก็ได้ไปช่วยเพื่อนๆ หลายๆ คน และได้ไปพบอยู่คนหนึ่ง มีปัญหาที่ว่า scanf ไม่ยอมรับค่าสักที ทำให้ผมต้องมานั่งไล่ Code เกือบทั้งหมด และก็ค้นพบว่ามันเป็นปัญหาของ stream ของ Keyboard Buffer ไม่ยอมเคลียร์ค่า \n
การที่ scanf ไม่ยอมรับค่า เกิดจากอะไร ?? (๊Update 14-14-2011)
เกิดจากการอ่านค่าของ scanf ในรูปแบบฟอแมทของพวกตัวเลข จะอ่านเฉพาะตัว string ที่เกี่ยวกับตัวเลขเท่านั้น (0 1 2 3 4 5 6 7 8 9 . + - ) อาจจะมีตัวอื่นอีกนะครับ แต่ในส่วนของตัว '\n' นั้นถือว่าไม่ใช่ string เกี่ยวกับตัวเลข จึง scanf ในฟอแมทของพวกตัวเลข จึงไม่รับ '\n' และค้างอยู่ใน KeyBoard Buffer ทำให้ถูกส่งไปยัง scanf ตัวต่อไป
จากตัวอย่าง Code ที่มีปัญหา ดังนี้
#include <stdio.h>
int main()
{
int num;
char name;
printf("Please input your number : ");
scanf("%d",&num);
printf("Please input your char : ");
scanf("%c",&name);
printf("\n\nyour number is %d\n",num);
printf("your name is %c",name);
printf("Finish");
return 0;
}
เมื่อทดสอบการรันโปรแกรมแล้วจะพบว่าจะข้ามการรับข้อมูลที่ scanf("%c",&name); และเมื่อทำการแสดงข้อมูลจะเห็นได้ว่า ข้อความ finish ได้ขั้นบรรทัดใหม่ ทั้งๆ ไม่มีการขึ้นบรรทัดใหม่ก่อนหน้านั้น
ฉนั้น จะเห็นได้ว่าเหตุที่ไม่ยอมหยุดรับค่าที่ scanf("%c",&name); เพราะมันได้รับค่า \n จากการใส่ข้อมูลตัวอแรกไปแล้ว
แล้วเราควรแก้ไขอย่างไร ??
เราสามารถแก้ไขได้โดยการใช้ฟังก์ชัน getchar() ไว้หลัง scanf เพื่อให้ \n ไม่ถูกส่งให้ scanf ตัวต่อไป แต่จะส่งให้ getchar เอง
ตัวอย่าง Code ที่ได้ทำการแก้ไขเสร็จแล้ว
#include <stdio.h>
int main()
{
int num;
char name;
printf("Please input your number : ");
scanf("%d",&num);
getchar();
printf("Please input your char : ");
scanf("%c",&name);
getchar();
printf("\n\nyour number is %d\n",num);
printf("your name is %c",name);
printf("Finish");
return 0;
}
คงจะมีประโยชน์ไม่มากก็น้อยนะครับ ^^
Update
Credits : อ.กบ อ.จิระ

ขอบคุณมากครับ วิธีเก่าแต่เก๋ามากครับ
ตอบลบ