You are on page 1of 56

CHAPTER 5

การรับและแสดงผลข้อมูล
INPUT/OUTPUT

ACTING SUB LT. CHAICHANA KULWORATIT, PH.D.


การรับและแสดงผลข้อมูล
• บทนี้จะกล่าวถึงวิธีการรับข้อมูลผ่านคีย์บอร์ดเข้ามาในโปรแกรม (Input) เพื่อนำมาประมวลผล
• รวมทัง้ วิธีการแสดงผลข้อความหรือผลลัพธ์ของโปรแกรมออกทางจอภาพ (Output)
• โดยบทนีจ้ ะกล่าวถึงรายละเอียดการทำงานของ Output ก่อน เพราะได้ศึกษาการแสดงผล
ข้อมูลออกทางจอภาพมาก่อนหน้านี้แล้ว และอาจจะสงสัยว่ามันมีหลักการทำงานอย่างไร
การแสดงผลข้อมูล (Output)
• ฟังก์ชันที่ใช้ในการแสดงผลออกทางจอภาพ คือ printf (Print Formatted)
• มีหน้าที่หลัก คือ แปลงข้อมูลในลักษณะของเลขฐานสอง (Binary) ที่คอมพิวเตอร์ประมวลผลได้
ให้อยู่ในรูปแบบที่มนุษย์เข้าใจก่อนการแสดงผลข้อมูลออกทางจอภาพ

รูปแบบ printf(“string_format”, data_list);

string_format คือ สตริงที่ต้องการแสดงผล ซึ่งอาจเป็นข้อความธรรมดา ๆ เช่น Hello,


C Language หรือเป็นสัญลักษณ์แทนชนิดข้อมูลต่าง ๆ เช่น %d ใช้แทนข้อมูลชนิด
เลขจำนวนเต็ม, %c ใช้แทนข้อมูลชนิดตัวอักษร เป็นต้น ซึ่งสัญลักษณ์นี้จะถูกแทนด้วย
ค่าคงที,่ ตัวแปร หรือนิพจน์ใด ๆ ที่กำหนดมาเป็นพารามิเตอร์ในส่วนของ data_list
data_list คือ ข้อมูลที่แสดงผล ซึ่งอาจเป็นค่าคงที,่ ตัวแปร หรือนิพจน์ใด ๆ
การแสดงผลข้อมูล (Output)
• ตัวแทนชนิดข้อมูลแต่ละประเภท
ชนิดข้อมูล ตัวแทนชนิดข้อมูล ชนิดข้อมูล ตัวแทนชนิดข้อมูล
char %c unsigned long int %lu
string %s long long int %lld
short int %hd unsigned long long int %llu
unsigned short int %hu float %f
int %d หรือ %i double %lf
unsigned int %u long double %Lf
long int %ld bool %d
การแสดงผลข้อมูล (Output)
ตัวอย่าง การใช้ฟังก์ชัน printf() รับค่าพารามิเตอร์ string_format
1 #include<stdio.h>
2 main()
3 {
4 printf("Hello World");
5 }
6 string_format เป็นข้อความธรรมดา
7

ผลลัพธ์ของโปรแกรม Hello World


การแสดงผลข้อมูล (Output)
ตัวอย่าง การใช้ฟังก์ชัน printf() รับค่าพารามิเตอร์ string_format, data_list
1 #include<stdio.h>
2 main() ค่าคงที่ 2 จะถูกแทนลงในสัญลักษณ์ %d
3 { ซึ่งเป็นตัวแทนของชนิดข้อมูล int
4 printf("1 + 1 = %d", 2);
data_list เป็นค่าคงที่
5 }
6 string_format เป็นข้อความธรรมดากับสัญลักษณ์ที่ใช้เป็นตัวแทนชนิดข้อมูล int
7

ผลลัพธ์ของโปรแกรม 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

ผลลัพธ์ของโปรแกรม Hello xyz


การแสดงผลข้อมูล (Output)
ตัวอย่าง การใช้ฟังก์ชัน printf() รับค่าพารามิเตอร์ string_format, data_list
1 #include<stdio.h> จับคู่ตัวแทนชนิดข้อมูล %d เข้ากับค่าคงที่ 2
2 main() จับคู่ตัวแทนชนิดข้อมูล %d เข้ากับตัวแปร x (จำนวนเต็ม)
3 { จับคู่ตัวแทนชนิดข้อมูล %d เข้ากับตัวแปร y (สตริง)
4 int x = 3;
5 char y[5] = "five"; data_list เป็นค่าคงที,่ ตัวแปร
และตัวแปร ตามลำดับ
6 printf("%d + %d = %s", 2, x, y);
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)

? • จากตัวอย่างที่ผ่านมา มักจะมีรหัส \n อยู่ในส่วนของ string_format


ของฟังก์ชัน printf()

• รหัสที่ขึ้นต้นด้วยเครื่องหมาย “\” (Backslash) เรียกว่า Escape Character


ซึ่งแบ่งออกเป็นหลายประเภท โดยมักใช้ Escape Character กำหนดไว้ในส่วนของ
string_format ของฟังก์ชัน printf() เพื่อช่วยในการจัดการแสดงผลตัวอักษร
ออกทางจอภาพ
การแสดงผลข้อมูล (Output)
• แสดง Escape Character
รหัส ความหมาย รหัส ความหมาย
\0 ค่าว่าง (Null Character) \t แท็บแนวนอน (Horizontal Tab)
\a ส่งเสียง 1 ครั้ง (Bell) \v แท็บแนวตั้ง (Vertical Tab)
\b ถอยหลัง 1 ช่องอักษร (Backspace) \' พิมพ์เครื่องหมาย '
\f ขึ้นหน้าใหม่ (Form Feed) \" พิมพ์เครื่องหมาย "
\n ขึ้นบรรทัดใหม่ (New Line) \\ พิมพ์เครื่องหมาย \
\r เลื่อนเคอร์เซอร์ไปทางซ้ายสุด (Carriage Return)
การแสดงผลข้อมูล (Output)
ตัวอย่าง โปรแกรมการหาพื้นที่และเส้นรอบวงกลม
1 #include <stdio.h>
2 #define PI 3.14159 ผลลัพธ์ของโปรแกรม
3 main()
4 {
5 float radius = 7.5, area, circum;
6 area = PI * radius * radius;
7 circum = 2 * PI * radius;
8
9 printf("Radius of circle is %f\n", radius);
10 printf("\tArea of circle is %.3f\n", area);
11 printf("\t\tCircumference of circle is %.5f\n", circum);
12 printf("\nConclusion\n");
13 printf("******************************************\n");
14 printf("Radius \t\tArea \t\tCircular\n");
15 printf("******************************************\n");
16 printf("%7.2f \t%-7.2f \t%7.2f\n", radius, area, circum);
17 printf("******************************************\n");
18 printf("******************************************\n");
19 printf("1234567890 \t1234567890 \t1234567890 \n");
20 }
การแสดงผลข้อมูล (Output)
อธิบายโปรแกรม
• บรรทัดที่ 9 พิมพ์ค่ารัศมีของวงกลม ซึ่งกำหนดค่าไว้เป็น 7.5 แต่เนือ่ งจากในการ
สั่งพิมพ์ไม่ได้ใส่ส่วนขยายใด ๆ ให้กับตัวแทนชนิดข้อมูล (คือ กำหนดเป็น %f)
ดังนั้น จึงพิมพ์ค่ารัศมีวงกลมออกมาเป็นเลขทศนิยม 6 ตำแหน่ง คือ 7.500000
• บรรทัดที่ 10 ใช้ Escape Character ‘\t’ ในการแสดงผล ทำให้ข้อความในบรรทัดนี้
แสดงผลเลื่อนจากขอบซ้ายไป 1 แท็บ และบรรทัดนี้สั่งพิมพ์ค่าพื้นที่วงกลม
โดยใส่ส่วนขยายให้กับตัวแทนชนิดข้อมูลเป็น %.3f ดังนั้น จึงพิมพ์คา่ ของวงกลมเป็น
ทศนิยม 3 ตำแหน่ง คือ 176.714
การแสดงผลข้อมูล (Output)
อธิบายโปรแกรม
• บรรทัดที่ 11 ใช้ Escape Character ‘\t’ 2 ครั้งในการแสดงผล ทำให้ข้อความ
ในบรรทัดนี้แสดงผลเลื่อนจากขอบซ้ายไป 2 แท็บ และสั่งพิมพ์ค่าเส้นรอบวงเป็น %.5f
จึงแสดงผลเป็นทศนิยม 5 ตำแหน่ง คือ 47.12385
• บรรทัดที่ 12-15 เป็นการจัดการแสดงผลหน้าจอ โดยใช้ Escape Character ร่วมด้วย
• บรรทัดที่ 16 พิมพ์ค่ารัศมี พื้นที่ และเส้นรอบวงของวงกลมตามลำดับ ซึ่งทั้งหมด
จะแสดงผลเป็น 7 หลัก (เป็นทศนิยม 2 ตำแหน่ง) โดยรัศมีและเส้นรอบวงกำหนด
การแสดงผลเป็น %7.2f ดังนั้น จะแสดงผลชิดขวา ส่วนพื้นที่วงกลมที่กำหนดเป็น
%-7.2f นั้น หน้าเลข 7 เป็นเครื่องหมายลบ จึงแสดงผลชิดซ้าย
• บรรทัดที่ 19 แสดงตัวเลข 0-9 เพื่อให้สังเกตการแสดงผลในบรรทัดที่ 16 ได้ง่าย
การแสดงผลข้อมูล (Output)
ตัวอย่าง โปรแกรมแสดงรายงานผลการศึกษา
ผลลัพธ์ของโปรแกรม
1 #include <stdio.h>
2 main()
3 {
4 printf("\t\t\t\\ 660000001 CHAICHANA KULWORATIT");
5 printf("\r 1st SEMESTER 2023\n");
6 printf("\n \'01417111\' \t Calculus I \t \t \t \t 3 \t \"A\"");
7 printf("\n \'01418111\' \t Introduction to Computer Science \t 3 \t \"A\"");
8 printf("\n \'01418112\' \t Fundamental Programming Concepts \t 3 \t \"A\"");
9 printf("\n\n---------------------------------------------------------------------");
10 printf("\n\t\t\t cum : 4.00");
11 printf("\n---------------------------------------------------------------------");
12 printf("\b\b\b*");
13 }
การแสดงผลข้อมูล (Output)
อธิบายโปรแกรม
• บรรทัดที่ 4 พิมพ์ข้อความ "660000001 CHAICHANA KULWORATIT" ห่างจากขอบซ้าย 3 แท็บ
• บรรทัดที่ 5 ใช้ Escape Character '\r' ซึ่งหมายถึง การเลื่อนเคอร์เซอร์ไปซ้ายสุด แต่สังเกตว่า
ข้อความในบรรทัดที่ 4 ไม่ได้ใช้ '\n' เพื่อสั่งขึ้นบรรทัดใหม่ ดังนั้น ฟังก์ชัน printf() ในบรรทัดที่ 5
จึงพิมพ์ข้อความ “1st SEMESTER 2023” ไว้ซ้ายสุดในบรรทัดเดียวกับผลลัพธ์ที่ได้จากฟังก์ชัน
printf() ในบรรทัดที่ 4
• บรรทัดที่ 6-8 มีการใช้ Escape Character \' และ \" เพื่อพิมพ์เครื่องหมาย ' และ "
• บรรทัดที่ 12 ใช้ Escape Character ‘\b’ ซึ่งหมายถึง ถอยหลังไป ช่องตัวอักษร แต่จะเห็นว่า
บรรทัดที่ 11 เมื่อพิมพ์ – ตัวสุดท้ายเรียบร้อยแล้ว ไม่มีการใช้ ‘\n’ เพื่อสั่งขึ้นบรรทัดใหม่
จึงทำให้เคอร์เซอร์ยังคงอยู่ในบรรทัดเดิม ดังนั้น เมื่อฟังก์ชัน printf() ในบรรทัดที่ 12
สั่ง '\b’ 3 ครั้ง แล้วพิมพ์ * ออกมา
การรับข้อมูล (Input)
• ฟังก์ชันที่ใช้ในการรับข้อมูลจากคีย์บอร์ด คือ scanf (Scan Formatted)
รูปแบบ scanf(“string_format”, address_list)
string_format ต่างจาก string_format ของฟังก์ชัน printf() ตรงที่ string_format
ของฟังก์ชัน scanf() จะอยู่ในรูปแบบของตัวแทนชนิดข้อมูลต่าง ๆ เช่น %d, %c,
%s, %f, ... เท่านั้น
address_list เป็นตัวระบุที่อยู่ (address) ในหน่วยความจำที่จะใช้ในการเก็บข้อมูลที่รับเข้ามานั้น
โดย address_list จะต่างกับ data_list ของฟังก์ชัน printf() ตรงที่ data_list
เป็นการระบุถึงข้อมูลโดยตรง ทำให้อ้างถึงตัวแปรที่เก็บข้อมูลนั้น ๆ ได้โดยตรง
ส่วน address_list เป็นการอ้างถึงที่อยู่ ดังนั้น จะเรียกโดยอ้างถึงตัวแปรโดยตรง
ไม่ได้ แต่ต้องอ้างถึงโดยใช้ Ampersand (&) นำหน้าชื่อตัวแปรที่ต้องการรับข้อมูล
เข้ามาเก็บไว้ ซึ่งเป็นการระบุที่อยู่ของตัวแปรนั้นในหน่วยความจำ
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงความแตกต่างระหว่าง address_list ของฟังก์ชัน scanf() กับ data_list ของฟังก์ชัน printf()

1 #include <stdio.h> Dev-C++ ผลลัพธ์ของโปรแกรม


2 main()
address_list อ้างถึงที่อยู่ของตัวแปร x
3 { เพื่อเก็บข้อมูลทีร่ ับเข้ามาจากคียบ์ อร์ดไว้ใน
หน่วยความจำตรงตำแหน่งทีอ่ ยู่นนั้
4 int x=3;
5 printf("Value of x is %d\n", x); Value of x is 3
5
6 scanf("%d",&x); New value of x is 5
7 printf("New value of x is %d\n", x);
8 } data_list อ้างถึงตัวแปร x โดยตรง
การรับข้อมูล (Input)
• การใช้ฟังก์ชัน scanf() รับข้อมูลชนิดสตริงเข้ามาทางคีย์บอร์ด จะไม่ใส่ &
นำหน้าตัวแปรที่ใช้รับค่า
• เนื่องจากภาษาซีกำหนดให้ชื่อตัวแปรชนิดสตริง (ซึ่งก็คืออาร์เรย์ของข้อมูลชนิด char)
เป็นการอ้างถึงที่อยู่ของตัวแปรนั้น ๆ อยู่แล้ว

• จากตัวอย่างที่ผ่านมา หากนำโค้ดโปรแกรมไปคอมไพล์บน Visual Studio 2022


จะพบข้อผิดพลาด เนื่องจาก Visual Studio 2022 ไม่ Support การใช้งานฟังก์ชัน scanf()
แต่ให้ใช้งาน scanf_s() แทน

‘scanf’: This function or variable may be unsafe.


Error Consider using scanf_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNING.
การรับข้อมูล (Input)
• สำหรับรายละเอียดของ scanf() จะอธิบายในหัวข้อถัดไป
• หากต้องการใช้งานฟังก์ชัน scanf() และคอมไพล์บน Visual Studio 2022
ให้กำหนดโค้ดด้านล่างนี้ไว้บรรทัดแรกของโปรแกรม

1 #define _CRT_SECURE_NO_WARNINGS

• ดังนั้น หากต้องใช้งานฟังก์ชัน scanf() บนโปรแกรม Visual Studio 2022


จะต้องไม่ลืมกำหนด #define _CRT_SECURE_NO_WARNINGS ไว้ที่บรรทัดแรกสุด
ของโปรแกรมเสมอ
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงความแตกต่างระหว่าง address_list ของฟังก์ชัน scanf() กับ data_list ของฟังก์ชัน printf()

1 #define _CRT_SECURE_NO_WARNINGS ผลลัพธ์ของโปรแกรม


2 #include <stdio.h> Visual Studio 2022
3 main()
4 {
5 int x=3; Value of x is 3
6 printf("Value of x is %d\n", x); 5
New value of x is 5
7 scanf("%d", &x);
8 printf("New value of x is %d\n", x);
9 }
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงการใช้งานฟังก์ชัน scanf()
16 printf("########################################################\n");
1 #include <stdio.h> 17 printf("# Name \t\t Age \t Birthday \t Weight #\n");
2 main() 18 printf("########################################################\n");
19 printf("# %s \t %d \t %s \t %.2f \t #\n", name, age, birthday, weight);
3 { 20 printf("########################################################");
4 char name[20] ,birthday[11]; 21 }

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, ... เท่านั้น

address_list เป็นตัวระบุที่อยู่ (address) ในหน่วยความจำที่จะใช้ในการเก็บข้อมูลที่รับเข้ามานั้น


โดย address_list จะต่างกับ data_list ของฟังก์ชัน printf() ตรงที่ data_list
เป็นการระบุถึงข้อมูลโดยตรง ทำให้อ้างถึงตัวแปรที่เก็บข้อมูลนั้น ๆ ได้โดยตรง
ส่วน address_list เป็นการอ้างถึงที่อยู่ ดังนั้น จะเรียกโดยอ้างถึงตัวแปรโดยตรง
ไม่ได้ แต่ต้องอ้างถึงโดยใช้ Ampersand (&) นำหน้าชื่อตัวแปรที่ต้องการรับข้อมูล
เข้ามาเก็บไว้ ซึ่งเป็นการระบุที่อยู่ของตัวแปรนั้นในหน่วยความจำ
size กำหนดขนาดบัฟเฟอร์ในการรับข้อมูลว่าต้องการรับข้อมูลขนาดเท่าไร่
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงการใช้งานฟังก์ชัน scanf()
1 #include <stdio.h> ผลลัพธ์ของโปรแกรม
2 main()
3 {
4 char greeting_words[20];
5
6 printf("Enter your greeting words : ");
7 scanf_s("%[^\n]", greeting_words, 19);
8 printf("Your first word is %s\n", greeting_words);
9 }
การรับข้อมูล (Input)
อธิบายโปรแกรม
• บรรทัดที่ 7 นำฟังก์ชัน scanf_s() มาใช้รับข้อมูลอินพุตจากคีย์บอร์ด โดยกำหนด
ขนาดบัฟเฟอร์ว่ารับข้อมูลไม่เกิน 19 ตัวอักษร
• จากผลลัพธ์จะพบว่าหากผู้ใช้งานกรอกข้อมูลไม่เกิน 19 ตัวอักษร ผลลัพธ์จะ
แสดงข้อมูลได้ถูกต้อง
• แต่ถ้าผู้ใช้กรอกข้อมูลเข้ามาเกิน 19 ตัวอักษรแล้วข้อความใด ๆ จะไม่ถูกนำมา
แสดงผลเลย ซึ่งตรงนี้ผู้ใช้งานโปรแกรมอาจไม่ทราบว่าเป็นเพราะเหตุใด และคิดว่า
โปรแกรมของเราทำงานผิดพลาด ซึ่งความจริงไม่เป็นเช่นนั้น ความจริงคือโปรแกรม
ได้กำหนดจำนวนตัวอักษรที่ให้กรอกเข้ามาเอาไว้ ดังนั้น จึงแก้ไขโปรแกรมได้ดังนี้
การรับข้อมูล (Input)
ตัวอย่าง โปรแกรมแสดงการใช้งานฟังก์ชัน scanf()
1 #include <stdio.h>
2 main()
ผลลัพธ์ของโปรแกรม
3 {
4 char greeting_words[20];
5
6 printf("Enter your greeting words : ");
7 if (scanf_s("%[^\n]", greeting_words, 19) == 1)
8 {
9 printf("Your first word is %s\n", greeting_words);
10 }
11 else
12 {
13 printf("Please input data 19 characters only\n");
14 }
15 }
การรับข้อมูล (Input)
if (scanf_s("%[^\n]", greeting_words, 19) == 1)
อธิบายโปรแกรม {
printf("Your first word is %s\n", greeting_words);
}
• นำคำสั่งเงื่อนไข if-else มาช่วยตรวจสอบการทำงาน else
{
(รายละเอียดเกี่ยวกับคำสั่ง if-else จะกล่าวในบทถัดไป) }
printf("Please input data 19 characters only\n");

• โดยถ้าผู้ใช้งานกรอกข้อมูลไม่เกิน 19 ตัวอักษรแล้ว
ฟังก์ชัน scanf_s() ก็จะคืนค่า 1 กลับมาให้ ดังนั้น การตรวจสอบจะเป็นดังนี้

ถ้า scanf_s() เท่ากับ 1


ให้พิมพ์ข้อความ Your first word is … ออกจากจอภาพ
นอกจากนี้แล้ว
ให้พิมพ์ข้อความ Please input data 19 characters only ออกทางจอภาพ
การรับและแสดงผลข้อมูลแบบตัวอักษร
• การรับและแสดงผลข้อมูลแบบอักษร นอกจากจะใช้ฟังก์ชัน scanf() และ printf()
แล้ว ยังมีฟังก์ชันเฉพาะที่ใช้ในการรับส่งข้อมูลแบบอักษร คือ getchar() และ
แสดงผลข้อมูลแบบตัวอักษร คือ putchar()

getchar()
• เป็นฟังก์ชันสำหรับรับข้อมูล 1 ตัวอักษรจากคีย์บอร์ด
putchar()
• เป็นฟังก์ชันสำหรับแสดงผลข้อมูล 1 ตัวอักษรออกทางจอภาพ
การรับและแสดงผลข้อมูลแบบตัวอักษร
ตัวอย่าง เปรียบเทียบการทำงานของฟังก์ชัน getchar() กับ scanf, scanf_s() และ putchar() กับ printf()

1 #include <stdio.h> 1 #include <stdio.h> 1 #include <stdio.h>


2 main() 2 main() 2 main()
3 { 3 { 3 {
4 char c; 4 char c; 4 char c;
5 c = getchar(); 5 scanf("%c",&c); 5 scanf_s("%c", &c, 1);
6 putchar(c); 6 printf("%c",c); 6 printf("%c", c);
7 } 7 } 7 }
ผลลัพธ์ของ • โปรแกรมทั้ง 3 โปรแกรมให้ผลลัพธ์เหมือนกัน
โปรแกรม อธิบาย • ดังนั้น จะเห็นว่าฟังก์ชัน getchar() ใช้งานได้เทียบกับฟังก์ชัน scanf() และ
a scanf_s() ส่วนฟังก์ชัน purchar() ใช้งานได้เทียบเท่าฟังก์ชัน printf()
โปรแกรม ในกรณีที่เป็นการรับและการแสดงข้อมูลแบบตัวอักษรเดียว
a
• ดังนั้น จึงขึ้นอยู่กับผู้เขียนโปรแกรมว่าจะเลือกฟังก์ชันมาใดใช้งาน
การรับและแสดงผลข้อมูลแบบตัวอักษร
ตัวอย่าง โปรแกรมแสดงการทำงานของฟังก์ชัน getchar() และ putchar()
1 #include<stdio.h> ผลลัพธ์ของ
โปรแกรม อธิบายโปรแกรม
2 main() a
3 { a • โปรแกรมนี้ใช้ลูป do-while (รายละเอียดเกี่ยวกับคำสั่ง
4 char c; b do-while จะกล่าวในบทถัดไป)
b • ในการตรวจสอบตัวอักษรที่ป้อนเข้ามาว่าเป็นอักษร E
5 do c
c หรือไม่ (ตัว e กับ E ถือว่าเป็นคนละตัวกัน เพราะต่างก็มี
6 {
d ค่าแอสกีเฉพาะตัวที่ไม่เหมือนกัน)
7 c = getchar(); d • ถ้าใช่ก็จะออกจากการทำงานของลูป แต่ถ้าไม่ใช่ ใน
8 putchar(c); e
บรรทัดที่ 7 ก็จะรอรับข้อมูลตัวอักษรต่อไปโดยใช้ฟังก์ชัน
e
9 } D getchar() และพิมพ์ตัวอักษรที่รับเข้ามาออกทาง
10 while(c != 'E'); D จอภาพด้วยฟังก์ชัน putchar() ในบรรทัดที่ 8 และจะ
E
11 } E ทำงานเช้านี้ต่อไปเรื่อย ๆ จนกว่าจะป้อนตัวอักษร E
การรับและแสดงผลข้อมูลแบบตัวอักษร
• นอกจากฟังก์ชัน getchar() แล้วยังมีอีก 2 ฟังก์ชันที่ใช้ในการรับข้อมูลแบบ
ตัวอักษร คือ getch() และ getche()

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()

ฟังก์ชัน การกดคีย์ Enter แสดงผลทางจอภาพ


getchar() ✓ ✓
getch()  
getche()  ✓
การรับและแสดงผลข้อมูลแบบสตริง
• นอกจากจะใช้ฟังก์ชัน scanf() และ printf() ในการรับและแสดงผลข้อมูลแล้ว ยัง
มีฟังก์ชันที่ทำงานกับสตริงโดยเฉพาะด้วย คือ fgets() ที่ใช้ในการรับข้อมูลสตริง
และ puts() ที่ใช้ในการแสดงผลข้อมูลสตริง
fgets()
• การอ่านข้อมูลของฟังก์ชัน fgets() นี้ หากข้อมูลที่ป้อนเข้ามาประกอบด้วยช่องว่าง
(Space) ก็ไม่เป็นปัญหา ฟังก์ชัน fgets() ยังคงอ่านข้อความต่อไปได้ สิ่งที่จะทำให้
ฟังก์ชัน fgets() หยุดอ่านข้อความมีเพียงกรณีเดียว คือ เมื่อกดคีย์ Enter
ซึ่งข้อมูลที่รับมาจากฟังก์ชัน fgets() นี้จะปิดท้ายข้อมูลด้วย \n (New Line) เสมอ
การรับและแสดงผลข้อมูลแบบสตริง
• รูปแบบของฟังก์ชัน fgets() คือ

รูปแบบ fgets("string_format", max_number, stream)

string_format สตริงที่เก็บค่าข้อมูลที่ผู้ใช้งานป้อนเข้ามา

max_number จำนวนตัวอักษรสูงสุดที่สามารถอ่านได้
(รวม \0 ที่เป็น Null Character ด้วย)
stream ระบุว่าต้องการให้อ่านข้อมูลได้จากที่ใด ในที่นี้ให้ระบุเป็น stdin
เพื่ออ่านข้อมูลจากคีย์บอร์ด
การรับและแสดงผลข้อมูลแบบสตริง
puts()

• มาจากคำว่า Put String เป็นฟังก์ชันสำหรับพิมพ์สตริงออกทางจอภาพ


โดยจะพิมพ์ New Line ('\n’) ต่อท้ายสตริงนั้น ๆ ด้วยเสมอ
การรับและแสดงผลข้อมูลแบบสตริง
ตัวอย่าง โปรแกรมแสดงการทำงานของฟังก์ชัน fgets() และ puts()
1 #include<stdio.h>
2 main()
3 {
4 char name[10],greeting[25] = "Welcome to C Language";
5 puts("What's your name?");
ผลลัพธ์ของโปรแกรม
6 fgets(name,10,stdin);
7 printf("Hi %s\n", name); What's your name?
Chibi Maruko
8 puts(greeting); Hi Chibi Mar
9 } Welcome to C Language

You might also like