Professional Documents
Culture Documents
การรับและแสดงผลข้อมูล
INPUT/OUTPUT
ผลลัพธ์ของโปรแกรม 1+1=2
การแสดงผลข้อมูล (Output)
ตัวอย่าง การใช้ฟังก์ชัน printf() รับค่าพารามิเตอร์ string_format, data_list
1 #include<stdio.h>
ค่าคงที่ 2 จะถูกแทนลงในสัญลักษณ์ %C
2 main()
ซึ่งเป็นตัวแทนของชนิดข้อมูล char
3 {
4 char X = 'x'; data_list เป็นตัวแปรที่เก็บข้อมูล
5 printf("Hello %cyz", X); ประเภทตัวอักษร
6 }
7 string_format เป็นข้อความธรรมดากับสัญลักษณ์ที่ใช้เป็นตัวแทนชนิดข้อมูล char
ผลลัพธ์ของโปรแกรม 2 + 3 = five
การแสดงผลข้อมูล (Output)
ตัวอย่าง การใช้ฟังก์ชัน printf() รับค่าพารามิเตอร์ string_format, data_list
1 #include<stdio.h> ผลลัพธ์ของโปรแกรม
2 main()
3 {
4 printf("%d\n", 233); 233
5 printf("%05d\n", 233); 00233
6 printf("%f\n", 233.33); 233.330000
7 printf("%.2f\n", 233.33); 233.33
8 }
การแสดงผลข้อมูล (Output)
อธิบายโปรแกรม
• บรรทัดที่ 4 เป็นการพิมพ์เลขจำนวนเต็มโดยไม่ใส่ส่วนขยายใด ๆ ให้กับตัวแทนชนิดข้อมูลจึงได้
ผลลัพธ์ออกทางจอภาพเป็น 233
• บรรทัดที่ 5 เป็นการพิมพ์เลขจำนวนเต็ม แต่มีการใส่ส่วนขยายเข้าไปทีต่ ัวแทนชนิดข้อมูล โดย 05
ที่ใส่เข้าไป หมายความว่า ให้ทำการพิมพ์เลขจำนวนเต็มทั้งหมด 5 หลัก โดยถ้าตัวเลขที่ต้องการ
พิมพ์มีไม่ถงึ 5 หลัก ให้เติม 0 เข้าข้างหน้าตัวเลขนั้นจนครบ 5 หลัก
• บรรทัดที่ 6 เป็นการพิมพ์เลขทศนิยม ซึ่งการสั่งพิมพ์โดยไม่ใส่ส่วนขยายใด ๆ ให้กบั ตัวแทน
ชนิดข้อมูลเลขทศนิยมนี้ จะทำให้ได้ผลลัพธ์เป็นเลขทศนิยม 6 ตำแหน่งเสมอ (คอมพิวเตอร์จะทำให้
เลข 233.33 อยู่ในรูปแบบ xxx.xxxxxx)
• บรรทัดที่ 7 เป็นการพิมพ์เลขทศนิยม โดยใส่ส่วนขยาย .2 ให้กับตัวแทนชนิดข้อมูล ซึ่งหมายถึง
การสั่งให้พิมพ์ข้อมูลเป็นเลขทศนิยม 2 ตำแหน่ง
การแสดงผลข้อมูล (Output)
ตัวอย่าง การใช้ฟังก์ชัน printf() รับค่าพารามิเตอร์ string_format, data_list
1 #include<stdio.h> ผลลัพธ์ของโปรแกรม
2 main()
3 {
4 printf("1234567890\n");
1234567890
5 printf("%-10.2f\n", 33333.99);
33333.99
6 printf("%10.2f\n", 33333.99);
33333.99
7 }
การแสดงผลข้อมูล (Output)
อธิบายโปรแกรม
• บรรทัดที่ 4 พิมพ์ 1234567890 ออกทางจอภาพเพื่อให้สังเกตในบรรทัดที่ 5 และ 6 ได้ง่าย
โดยให้ 1 หมายถึง หลักที่ 1, 2 หมายถึง หลักที่ 2, …, 0 หมายถึงหลักที่ 10
• บรรทัดที่ 5 พิมพ์เลขทศนิยม โดยใส่ส่วนขยาย -10.2 ให้กับตัวแทนชนิดข้อมูล
ซึ่งเครื่องหมาย – หมายถึง ให้จัดการแสดงผลชิดซ้าย สำหรับ 10.2 หมายถึง
ให้แสดงผลลัพธ์ทั้งหมด 10 หลัก และแสดงผลเป็น 2 ตำแหน่ง จากผลลัพธ์ที่ได้จะเห็นว่า
33333.99 แสดงผลชิดซ้าย และมีทั้งหมด 8 หลัก (รวมจุดทศนิยมด้วย) ไม่ครบ 10 หลัก
ตามที่กำหนด ซึ่งสำหรับกรณีนี้จะไม่มีการเติม 0 ให้มีกี่หลักก็แสดงผลเท่านั้น
• บรรทัดที่ 6 ใส่ส่วนขยายเป็น 10.2 ซึ่งรายละเอียดจะเหมือนบรรทัดที่ 5 ทุกประการ
ยกเว้นการแสดงผลจะชิดขวาแทนที่จะชิดซ้าย
การแสดงผลข้อมูล (Output)
1 #define _CRT_SECURE_NO_WARNINGS
5 int age;
รับค่าสตริง ไม่ต้องใส่ & นำหน้าตัวแปร
6 float weight;
7 รับค่าที่ไม่ใช่สตริง ต้องใส่ & นำหน้าตัวแปร
8 printf("Name : ");
9 scanf("%s", name); ผลลัพธ์ของโปรแกรม
10 printf("Age : ");
11 scanf("%d", &age);
12 printf("Birthday : ");
13 scanf("%s", birthday);
14 printf("Weight : ");
15 scanf("%f", &weight);
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงการใช้งานฟังก์ชัน scanf()
1 #include <stdio.h>
2 main()
3 {
4 int x = 3; ป้อน 333 เข้ามาทางคีย์บอร์ด แต่ฟังก์ชัน scanf
5 scanf("%d", x); ไม่ได้ใส่เครื่องหมาย & ทำให้ scanf ไม่สามารถอ้างถึง
6 printf("%d", x); ที่อยู่ของตัวแปร x ได้ โปรแกรมจึงหยุดการทำงาน
7 }
333
ผลลัพธ์ของโปรแกรม 3
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงการใช้งานฟังก์ชัน scanf()
1 #include <stdio.h>
2 main() ป้อนข้อมูลเข้ามาทางคีย์บอร์ดคั้นด้วยช่องว่าง
3 { สังเกตว่าอักษร c ไม่ได้แสดงผลเพราะ
4 int a,b; • %d%d เขียนติดกันได้ เพราะโปรแกรมจะแปล
5 char c; ผลช่องว่างให้โดยอัตโนมัติ
6 scanf("%d%d%c", &a, &b, &c); • ชนิดข้อมูลแบบตัวอักษร ไม่สนับสนุนการแปล
7 printf("%d %d %c", a, b, c); ผลช่องว่าง หาก %c ไม่เว้นวรรคจะเกิดปัญหา
8 }
10 20 c
ผลลัพธ์ของโปรแกรม 10 20
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงการใช้งานฟังก์ชัน scanf()
1 #include <stdio.h>
2 main()
3 {
4 int a,b;
5 char c;
6 scanf("%d%d %c", &a, &b, &c); เมื่อเว้นวรรค %c ก็จะทำงานได้เป็นปกติ
7 printf("%d %d %c", a, b, c);
8 }
10 20 c
ผลลัพธ์ของโปรแกรม 10 20 c
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงการใช้งานฟังก์ชัน scanf()
1 #include <stdio.h>
2 main()
3 {
ป้อนเลข 3 จำนวน แต่ฟังก์ชัน scanf()
4 int a=10, b=20, c=30;
รับค่าเข้ามาแค่ 2 ค่า อีก 1 ค่า ไม่มีตัวแทนชนิด
5 scanf("%d%d", &a, &b, &c);
ข้อมูลมารองรับ ดังนั้น c จึงได้ 30 เหมือนเดิม
6 printf("%d %d %d", a, b, c);
7 }
5 10 15
ผลลัพธ์ของโปรแกรม 5 10 30
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมรับค่าตัวเลขด้วย scanf() และนำมาหาค่าเฉลี่ย
1 #include <stdio.h> 14 printf("Enter integer number3 : ");
2 main() 15 scanf("%d", &c);
3 { 16 printf("Enter floating number4 : ");
4 char name[10]; 17 scanf("%f", &d);
5 int a, b, c; 18 printf("Enter floating number5 : ");
6 float d, e, f; 19 scanf("%f", &e);
7 20 f = (a + b + c + d + e) / 5;
8 printf("Enter your name : "); 21 printf("\nHi %s\n", name);
9 scanf("%s", name); 22 printf("Average of your number are %.2f", f);
10 printf("Enter integer number1 : "); 23 }
11 scanf("%d", &a);
12 printf("Enter integer number2 : ");
13 scanf("%d", &b); แสดงผลลัพธ์เป็นเลขทศนิยม 2 ตำแหน่ง
การรับข้อมูล (Input)
ผลลัพธ์ของโปรแกรม
Enter your name : Maruko
Enter integer number1 : 1
Enter integer number2 : 2
Enter integer number3 : 3
Enter floating number4 : 4.5
Enter floating number5 : 5.5
Hi Maruko
Average of your number are 3.20
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงการใช้งานฟังก์ชัน scanf()
1 #include <stdio.h> ผลลัพธ์ของโปรแกรม
2 main()
3 {
4 char name[10];
5 int age;
6
7 printf("Enter your name : ");
8 scanf("%s", name);
9 printf("Enter your age : ");
10 scanf("%d", &age);
11 printf("Your name is %s, age %d years\n", name, age);
12 }
การรับข้อมูล (Input)
อธิบายโปรแกรม
• ตัวอย่างนี้กำหนดให้รับค่าชื่อและอายุเข้ามา สังเกตที่ผลลัพธ์ของโปรแกรม หากผู้ใช้งานป้อนโดยไม่กรอก
นามสกุล โปรแกรมจะทำงานได้ตามปกติ แต่ถ้าผู้ใช้งานป้อนชื่อและนามสกุลเข้ามา โดยเว้นวรรคระหว่าง
ชื่อและนามสกุล โปรแกรมจะทำงานผิดพลาดทันที เนื่องจากการทำงานของฟังก์ชัน scanf() นั้น
คอมไพเลอร์จะหยุดอ่านค่าตัวอักษรเมื่อพบช่องว่าง ดังนั้น หลังกรอกชื่อแล้วเคาะช่องว่างเพื่อกรอก
นามสกุล คอมไพเลอร์ก็จะหยุดอ่านค่าตัวอักษรที่เหลือ ซึ่งส่งผลให้การรับค่าอายุผิดพลาดไปด้วย
• วิธีแก้ไข หากต้องการรับค่าสตริงโดยเว้นช่องว่างระหว่างสตริง ให้แก้ไขบรรทัดที่ 8 เป็นดังนี้
8 scanf("%[^\n]", name);
• คำสั่งนี้จะบอกให้คอมไพเลอร์อ่านค่าตัวอักษรไปจนกว่าจะพบ \n ซึ่งหมายถึงการกดคีย์ Enter
เพื่อขึ้นบรรทัดใหม่นั่นเอง
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงการใช้งานฟังก์ชัน scanf()
1 #include <stdio.h> ผลลัพธ์ของโปรแกรม
2 main()
3 {
4 char name[10];
5 int age;
6
7 printf("Enter your name : ");
8 scanf("%[^\n]", name);
9 printf("Enter your age : ");
10 scanf("%d", &age);
11 printf("Your name is %s, age %d years\n", name, age);
12 }
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงการใช้งานฟังก์ชัน scanf()
1 #include <stdio.h> ผลลัพธ์ของโปรแกรม
2 main()
3 {
4 char greeting_words[20];
5
6 printf("Enter your greeting words : ");
7 scanf("%[^\n]", greeting_words);
8 printf("%s\n", greeting_words);
9 }
การรับข้อมูล (Input)
อธิบายโปรแกรม
• ตัวอย่างนี้กำหนดสตริง greeing_words ขนาด 20 ตัวอักษร แต่กำหนดรับค่าข้อมูลจากคียบ์ อร์ดเป็น
scanf("%[^\n]", greeting_words); กล่าวคือ คำสั่งนี้ไม่ได้กำหนดว่าต้องการรับข้อมูลขนาดเท่าไหร่
• จากตัวอย่าง ผู้ใช้งานกรอกข้อมูลทักทายเข้ามามากกว่า 19 ตัวอักษร ตรงนี้ก็จะทำให้เกิด Buffer
Overflow ขึ้น เหตุผลที่เป็นเช่นนี้ เนื่องจากสตริง greeing_words เก็บข้อมูลได้แค่ 19 ตัวอักษรเท่านั้น
(ช่องสุดท้ายของสตริงจะเก็บ \0 ซึ่งเป็น Null Character)
• ดังนั้น เพื่อความปลอดภัย เพื่อไม่ให้โปรแกรมสร้างปัญหา Buffer Overflow กรณีนี้ควรกำหนดว่า
ต้องการให้คำสั่ง scanf() รับข้อมูลได้กี่ตัวอักษร เช่น กรณีนี้ควรกำหนดเป็น scanf("%19[^\n]",
greeting_words); ซึ่งหากผู้ใช้งานป้อนข้อมูลเข้ามามากกว่า 19 ตัวอักษรแล้ว ตัวอักษรที่เกินจาก
19 ตัวอักษรจะถูกตัดทิ้งไป จึงช่วยแก้ปัญหา Buffer Overflow ได้
7 scanf("%19[^\n]", greeting_words);
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงการใช้งานฟังก์ชัน scanf()
1 #include <stdio.h> ผลลัพธ์ของโปรแกรม
2 main()
3 {
4 char greeting_words[20];
5
6 printf("Enter your greeting words : ");
7 scanf("%19[^\n]", greeting_words);
8 printf("%s\n", greeting_words);
9 }
การรับข้อมูล (Input)
• ฟังก์ชันที่ใช้ในการรับข้อมูลจากคีย์บอร์ดอีก 1 ตัว คือ ฟังก์ชัน scanf_s()
• โดยฟังก์ชันนี้ถูกสร้างขึ้นมา เพื่อแก้ปัญหาเรื่องของ Buffer Overflow ที่อาจเกิด
จากการใช้งานฟังก์ชัน scanf()
• ในกรณีที่ฟังก์ชัน scanf() รับข้อมูลโดยไม่กำหนดขนาดข้อมูล (แม้วา่ scanf()
จะสามารถกำหนดได้ว่าต้องการรับข้อมูลกี่ตัวอักษร) แต่การกำหนดตรงนี้ไม่ได้
บังคับ ดังนั้น โปรแกรมเมอร์อาจลืมกำหนด และก่อปัญหา Buffer Overflow ได้)
สำหรับฟังก์ชัน scanf_s() ตัวฟังก์ชันจะบังคับให้กำหนดขนาดข้อมูลเสมอว่า
ต้องการรับข้อมูลขนาดเท่าไร
รูปแบบ scanf_s(“string_format, address_list,”)
การรับข้อมูล (Input)
string_format ต่างจาก string_format ของฟังก์ชัน printf() ตรงที่ string_format
ของฟังก์ชัน scanf_s() จะอยู่ในรูปแบบของตัวแทนชนิดข้อมูลต่าง ๆ เช่น %d, %c,
%s, %f, ... เท่านั้น
• โดยถ้าผู้ใช้งานกรอกข้อมูลไม่เกิน 19 ตัวอักษรแล้ว
ฟังก์ชัน scanf_s() ก็จะคืนค่า 1 กลับมาให้ ดังนั้น การตรวจสอบจะเป็นดังนี้
getchar()
• เป็นฟังก์ชันสำหรับรับข้อมูล 1 ตัวอักษรจากคีย์บอร์ด
putchar()
• เป็นฟังก์ชันสำหรับแสดงผลข้อมูล 1 ตัวอักษรออกทางจอภาพ
การรับและแสดงผลข้อมูลแบบตัวอักษร
ตัวอย่าง เปรียบเทียบการทำงานของฟังก์ชัน getchar() กับ scanf, scanf_s() และ putchar() กับ printf()
getch()
• อ่าน 1 ตัวอักษรจากคีย์บอร์ด แต่ไม่แสดงผลตัวอักษรที่รับเข้ามาออกทางหน้าจอ
getche()
• อ่าน 1 ตัวอักษรจากคีย์บอร์ด และแสดงผลตัวอักษรที่รับเข้ามาออกทางหน้าจอ
การรับและแสดงผลข้อมูลแบบตัวอักษร
ตัวอย่าง เปรียบเทียบการทำงานของฟังก์ชัน getchar(), getch() และ getche()
ผลลัพธ์
1 #include <stdio.h> ของ 1 #include <stdio.h> ผลลั พธ์
ของ 1 #include <stdio.h> ผลลั พธ์
ของ
โปรแกรม
2 2 #include <conio.h> โปรแกรม 2 #include <conio.h> โปรแกรม
a
3 main() b 3 main() 3 main() abcdeDE
c
4 { d 4 { 4 {
e
5 char c; D 5 char c; 5 char c;
6 do E
6 do 6 do
7 { 7 { 7 {
8 c = getchar(); 8 c = getch(); 8 c = getche();
9 } 9 } 9 }
10 while(c != 'E'); 10 while(c != 'E'); 10 while(c != 'E');
11 } 11 } 11 }
การรับและแสดงผลข้อมูลแบบตัวอักษร
• Visual Studio 2022 ไม่ Support การทำงานของฟังก์ชัน getch()
และ getche()
• เนื่องจากทั้งสองฟังก์ชันนี้ไม่ได้เป็นฟังก์ชันมาตรฐานของภาษาซี
แต่เป็นฟังก์ชันที่อยู่ในเฮดเดอร์ไฟล์ conio.h ซึ่งส่วนใหญ่ใช้กับคอมไพเลอร์
ประเภท MS-DOS complier เช่น Turbo C
• ดังนั้น ถ้าผู้อ่านใช้ IDE ตัวนี้ สามารถข้ามการคอมไพล์และรันโปรแกรม
ส่วนนี้ไปได้
• ส่วน Dev-C++ สามารถคอมไพล์และรันทั้ง 3 โปรแกรมด้านบนได้
การรับและแสดงผลข้อมูลแบบตัวอักษร
อธิบายโปรแกรม
• โปรแกรมที่ 1 ใช้ฟังก์ชัน getchar() ในการรับตัวอักษรจากคีย์บอร์ด ซึ่งเมื่อป้อนตัวอักษร
เข้ามาแล้ว จะต้องกดคีย์ Enter ทุกครั้ง กล่าวคือ ฟังก์ชัน getchar() จะยังไม่รับตัวอักษร
ไปประมวลผลจนกว่าผู้ใช้จะกดคีย์ Enter และเมื่อกดคีย์ Enter แล้วเคอร์เซอร์ก็จะย้ายไปยัง
บรรทัดถัดไป
• โปรแกรมที่ 2 ใช้ฟังก์ชัน getch() ในการรับตัวอักษรจากคีย์บอร์ด จะไม่เห็นว่าไม่ปรากฏผล
ลัพธ์ใด ๆ บนจอภาพ ที่เป็นเช่นนี้เนื่องจากฟังก์ชัน getch() จะไม่แสดงผลตัวอักษรที่
ป้อนเข้าไปออกทางหน้าจอ และเมื่อป้อนตัวอักษรแล้วตัวอักษรนั้นจะถูกนำไปประมวลผลทันที
ผู้ใช้ไม่ต้องทำการกดคีย์ Enter ใด ๆ ทั้งสิ้น (ฟังก์ชัน getch() มีการประกาศไว้ในฮดเดอร์
ไฟล์ conio.h ดังนั้น จึงต้องรวมเฮดเดอร์ไฟล์นี้เข้าในโปรแกรมด้วย)
การรับและแสดงผลข้อมูลแบบตัวอักษร
อธิบายโปรแกรม
• โปรแกรมที่ 3 ใช้ฟังก์ชัน getche() ในการรับตัวอักษรจากคีย์บอร์ จะเห็นว่าฟังก์ชัน
getche() แสดงผลตัวอักษรที่ป้อนเข้าไปออกทางหน้าจอเหมือนโปรแกรมที่ 1 ด้วย
แต่ฟังก์ชัน getche() ต่างจากฟังก์ชัน getchar() เพียงเล็กน้อย คือ สำหรับ
ฟังก์ชัน getche() นั้น ผู้ใช้ไม่ต้องทำการกดคีย์ Enter โดยเมื่อป้อนตัวอักษรแล้ว
ตัวอักษรตะถูกนำไปประมวลผลทันที (ฟังก์ชัน getche() มีการประกาศไว้ในเฮด
เดอร์ไฟล์ conio.h) ดังนั้น จึงต้องรวมเฮดเดอร์ไฟล์นี้เข้าไว้ในโปรแกรมด้วย
การรับและแสดงผลข้อมูลแบบตัวอักษร
• ตารางเปรียบเทียบการทำงานของฟังก์ชัน getchar(), getch() และ getche()
string_format สตริงที่เก็บค่าข้อมูลที่ผู้ใช้งานป้อนเข้ามา
max_number จำนวนตัวอักษรสูงสุดที่สามารถอ่านได้
(รวม \0 ที่เป็น Null Character ด้วย)
stream ระบุว่าต้องการให้อ่านข้อมูลได้จากที่ใด ในที่นี้ให้ระบุเป็น stdin
เพื่ออ่านข้อมูลจากคีย์บอร์ด
การรับและแสดงผลข้อมูลแบบสตริง
puts()