
บทนำ
ภาษาโปรแกรมมิ่ง C ถูกเปิดตัวมามากกว่า 5 ทศวรรษแล้ว และได้รับความนิยมอย่างมากในโลกโปรแกรมมิ่ง ภาษานี้โดดเด่นด้วยคุณสมบัติต่างๆ เช่น โครงสร้างที่เรียบง่าย ฟังก์ชัน ความพกพา การจัดการหน่วยความจำที่มีประสิทธิภาพ และอื่นๆ โดยเฉพาะฟังก์ชันในภาษา C ถือเป็นทรัพย์สินที่สำคัญที่สุดซึ่งช่วยให้นักพัฒนาสามารถเขียนโค้ดที่แข็งแกร่งได้
ฟังก์ชัน itoa เป็นฟังก์ชันที่ไม่ใช่มาตรฐาน (non-standard) ที่ใช้กันอย่างแพร่หลายในการแปลงชนิดข้อมูล โดยรับค่า integer เข้ามาและแปลงเป็นสตริง อย่างไรก็ตาม หลายคนอาจยังไม่ทราบวิธีการใช้งานที่ถูกต้อง บทความนี้จะอธิบายวิธีใช้ฟังก์ชัน itoa ในภาษา C อย่างละเอียดและเข้าใจง่าย
ไวยากรณ์พื้นฐานของฟังก์ชัน itoa
รูปแบบการเรียกใช้งานฟังก์ชัน itoa มีดังนี้:
char *itoa(int value, char *str, int base);
โดยพารามิเตอร์แต่ละตัวมีความหมายดังนี้:
- value - ค่าจำนวนเต็มที่ต้องการแปลง
- str - อาร์เรย์ตัวอักษร (character array) สำหรับเก็บผลลัพธ์
- base - ฐานเลขที่ต้องการแปลง (เช่น 10 สำหรับฐานสิบ, 16 สำหรับฐานสิบหก, 2 สำหรับฐานสอง)
ตัวอย่างการใช้งานพื้นฐาน
#include <stdio.h>
#include <stdlib.h>
int main() {
int num = 12345;
char str[20];
itoa(num, str, 10);
printf("Integer: %d\nString: %s\n", num, str);
return 0;
}
คำอธิบายโค้ด:
- num คือตัวแปรจำนวนเต็มที่มีค่า 12345
- str คืออาร์เรย์ตัวอักษรขนาด 20 ไบต์สำหรับเก็บสตริงผลลัพธ์
- 10 คือฐานเลข (base 10 = ฐานสิบ)
การสร้างฟังก์ชัน itoa เอง (Custom Implementation)
เนื่องจาก itoa ไม่ใช่ฟังก์ชันมาตรฐาน ANSI C บางคอมไพเลอร์อาจไม่รองรับ จึงควรทราบวิธีสร้างเองได้ ด้านล่างคือตัวอย่างการ implement ฟังก์ชัน itoa แบบสมบูรณ์:
#include <stdio.h>
#include <stdlib.h>
void itoa(int num, char *str, int base) {
int i = 0;
int isNegative = 0;
// กรณีค่าเป็น 0
if (num == 0) {
str[i++] = '0';
str[i] = '\0';
return;
}
// จัดการค่าลบ (เฉพาะฐาน 10)
if (num < 0 && base == 10) {
isNegative = 1;
num = -num;
}
// แปลงตัวเลขแต่ละหลักเป็นตัวอักษร
while (num != 0) {
int rem = num % base;
str[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
num = num / base;
}
// เพิ่มเครื่องหมายลบถ้าจำเป็น
if (isNegative)
str[i++] = '-';
str[i] = '\0';
// กลับลำดับสตริง (เพราะได้ตัวเลขจากหลักหน่วยขึ้นมา)
int start = 0;
int end = i - 1;
while (start < end) {
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
int main() {
int num;
printf("Enter an integer: ");
if (scanf("%d", &num) != 1) {
fprintf(stderr, "Invalid input. Please enter an integer.\n");
return EXIT_FAILURE;
}
// คำนวณขนาดบัฟเฟอร์ที่จำเป็น
int max_size = snprintf(NULL, 0, "%d", num) + 1;
char *str = (char *)malloc(max_size);
if (str == NULL) {
fprintf(stderr, "Memory allocation failed\n");
return EXIT_FAILURE;
}
itoa(num, str, 10);
printf("Integer: %d\nString: %s\n", num, str);
free(str);
return 0;
}
รายละเอียดการทำงานของแต่ละส่วน
1. การจัดการค่าศูนย์
if (num == 0) {
str[i++] = '0';
str[i] = '\0';
return;
}
ถ้าค่าที่ป้อนเข้ามาเป็น 0 จะกำหนดสตริงผลลัพธ์เป็น "0" ทันทีและคืนค่ากลับ
2. การจัดการค่าลบ
if (num < 0 && base == 10) {
isNegative = 1;
num = -num;
}
สำหรับฐาน 10 เท่านั้น จะตั้งค่า flag isNegative และทำให้ num เป็นค่าบวกเพื่อนำไปคำนวณต่อ
3. ลูปแปลงตัวเลขเป็นตัวอักษร
while (num != 0) {
int rem = num % base;
str[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
num = num / base;
}
ลูปนี้จะดึงตัวเลขแต่ละหลัก (จากหลักหน่วยขึ้นมา) และแปลงเป็นตัวอักษร สำหรับฐานมากกว่า 10 จะใช้ตัวอักษร 'a' ถึง 'f' แทนค่า 10-15
4. เพิ่มเครื่องหมายลบและจบสตริง
if (isNegative)
str[i++] = '-';
str[i] = '\0';
5. การกลับลำดับสตริง
int start = 0;
int end = i - 1;
while (start < end) {
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
เนื่องจากตัวเลขถูกดึงมาจากหลักหน่วยขึ้นไป สตริงจึงต้องกลับลำดับเพื่อให้ได้ผลลัพธ์ที่ถูกต้อง
ตัวอย่างผลลัพธ์การรันโปรแกรม

การจัดการข้อผิดพลาด
หากผู้ใช้ป้อนข้อมูลที่ไม่ใช่จำนวนเต็ม โปรแกรมจะแสดงข้อความผิดพลาด:

สรุป
บทความนี้ได้อธิบายวิธีการใช้งานและสร้างฟังก์ชัน itoa ในภาษา C อย่างละเอียด เริ่มจากไวยากรณ์พื้นฐาน ตัวอย่างการใช้งาน การ implement เอง รวมถึงการจัดการข้อผิดพลาด การเข้าใจฟังก์ชันนี้จะช่วยให้คุณสามารถแปลงข้อมูลระหว่าง integer และ string ได้อย่างมีประสิทธิภาพ และนำไปประยุกต์ใช้กับโปรแกรมที่ซับซ้อนมากขึ้นได้
เกี่ยวกับผู้เขียน

Prateek Jangid
ผู้ใช้ Linux มืออาชีพที่หลงใหลในการสำรวจเทคโนโลยีใหม่ๆ ในโลกของ Linux และแบ่งปันความรู้ให้กับผู้อ่าน