1. บทนำ: ความสำคัญของการแปลงระหว่างสตริงและตัวเลขในภาษา C
ในการเขียนโปรแกรมภาษา C การแปลงระหว่างสตริงและตัวเลขถือเป็นกระบวนการที่สำคัญมาก โดยเฉพาะเมื่อจำเป็นต้องประมวลผลข้อมูลที่ได้รับจากผู้ใช้หรือไฟล์ภายนอก มักจะต้องแปลงสตริงเป็นตัวเลข ในทางกลับกัน การแปลงตัวเลขเป็นสตริงเพื่อใช้ในผลลัพธ์หรือบันทึก log ก็พบได้บ่อยเช่นกัน
มีวิธีการแปลงหลายแบบ ซึ่งควรเลือกวิธีให้เหมาะสมกับสถานการณ์การใช้งาน ในบทความนี้จะอธิบายวิธีการแปลงระหว่างสตริงและตัวเลขในภาษา C อย่างละเอียด พร้อมทั้งพูดถึงการจัดการข้อผิดพลาดและการใช้งานอย่างปลอดภัย
2. วิธีแปลงสตริงเป็นตัวเลขในภาษา C
การแปลงสตริงเป็นจำนวนเต็มอย่างง่ายด้วยฟังก์ชัน atoi()
วิธีพื้นฐานที่สุดในการแปลงสตริงเป็นจำนวนเต็มในภาษา C คือการใช้ฟังก์ชัน atoi()
ฟังก์ชันนี้ใช้งานได้ง่าย แต่มีข้อควรระวัง ด้านล่างคือตัวอย่างการใช้งานพื้นฐาน
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = "123";
int num = atoi(str);
printf("ค่าหลังแปลง: %dn", num);
return 0;
}
atoi()
แม้จะใช้ง่าย แต่ไม่สามารถตรวจสอบข้อผิดพลาดได้ เช่น หากมีอินพุตไม่ถูกต้อง จะไม่ได้แจ้งข้อผิดพลาด ตัวอย่างด้านล่างแสดงพฤติกรรมของ atoi()
เมื่อเจอสตริงที่ไม่ถูกต้อง
char str[] = "123abc";
int num = atoi(str); // จะคืนค่าเฉพาะ "123" ส่วนที่เหลือจะถูกละเว้น
atoi()
จะคืนค่าเฉพาะส่วนที่แปลงได้ แม้จะมีข้อมูลที่ไม่ถูกต้อง ดังนั้นในระบบที่ต้องการความปลอดภัยควรหลีกเลี่ยงการใช้ฟังก์ชันนี้
การแปลงที่ปลอดภัยด้วยฟังก์ชัน strtol()
หากต้องการตรวจสอบข้อผิดพลาด แนะนำให้ใช้ strtol()
ซึ่งสามารถจัดการข้อผิดพลาดได้และสามารถกำหนดฐานของตัวเลขได้ ตัวอย่างด้านล่างแสดงวิธีใช้ strtol()
ในการแปลงสตริงเป็นจำนวนเต็มอย่างปลอดภัย
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
char str[] = "123abc";
char *endptr;
errno = 0; // รีเซ็ตค่า error
long num = strtol(str, &endptr, 10);
if (errno != 0 || *endptr != ' ') {
printf("การแปลงล้มเหลว\n");
} else {
printf("ค่าหลังแปลง: %ldn", num);
}
return 0;
}
ตัวอย่างนี้จะใช้ตัวแปร endptr
เพื่อตรวจสอบส่วนที่แปลงไม่ได้ และใช้ errno
เพื่อตรวจจับข้อผิดพลาดเช่น overflow/underflow

3. วิธีแปลงตัวเลขเป็นสตริงในภาษา C
ฟังก์ชัน sprintf()
และความเสี่ยง
การแปลงตัวเลขเป็นสตริงในภาษา C มักใช้ sprintf()
โดยจะเขียนค่าลง buffer ตามรูปแบบที่กำหนด อย่างไรก็ตาม มีความเสี่ยงเรื่อง buffer overflow ตัวอย่างการใช้งานดังนี้
#include <stdio.h>
int main() {
int num = 123;
char str[10];
sprintf(str, "%d", num);
printf("สตริงหลังแปลง: %sn", str);
return 0;
}
หากสตริงที่แปลงได้มีความยาวเกินขนาด buffer จะเกิด overflow ได้
การแปลงอย่างปลอดภัยด้วย snprintf()
เพื่อป้องกัน buffer overflow ควรใช้ snprintf()
ซึ่งสามารถกำหนดขนาด buffer ได้ ตัวอย่างต่อไปนี้
#include <stdio.h>
int main() {
int num = 12345;
char str[5];
snprintf(str, sizeof(str), "%d", num);
printf("สตริงหลังแปลง: %sn", str); // buffer เล็ก ผลลัพธ์คือ "1234"
return 0;
}
ถ้าข้อมูลเกินขนาด buffer ข้อมูลส่วนเกินจะถูกตัดออก snprintf()
จึงเป็นวิธีที่ปลอดภัยในการแปลง
4. ตัวอย่างการใช้งานจริง: แปลงข้อมูลทั้งสองทิศทาง
ในภาษา C มักต้องแปลงข้อมูลทั้งสองทิศทาง ตัวอย่างด้านล่างใช้ sscanf()
และ snprintf()
เพื่อแปลงจากสตริงเป็นตัวเลข และตัวเลขเป็นสตริง
#include <stdio.h>
int main() {
char str[] = "12345";
int num;
sscanf(str, "%d", &num);
printf("แปลงจากสตริงเป็นตัวเลข: %dn", num);
char new_str[10];
snprintf(new_str, sizeof(new_str), "%d", num);
printf("แปลงจากตัวเลขเป็นสตริง: %sn", new_str);
return 0;
}
ตัวอย่างนี้ใช้ sscanf()
แปลงสตริงเป็นตัวเลข จากนั้นใช้ snprintf()
แปลงกลับเป็นสตริง การแปลงไปมานี้มีประโยชน์เมื่อต้องประมวลผลข้อมูลและแสดงผลลัพธ์
5. การจัดการข้อผิดพลาดและข้อควรระวัง
การจัดการ overflow/underflow
เมื่อแปลงข้อมูล อาจเกิด overflow หรือ underflow ได้ หากค่าที่แปลงได้อยู่นอกช่วงของชนิดข้อมูล เช่นเมื่อใช้ strtol()
หรือ sscanf()
ควรตรวจสอบข้อผิดพลาดดังนี้
if (errno == ERANGE) {
printf("เกิด overflow หรือ underflow\n");
}
สามารถตรวจสอบ errno
เพื่อดูว่าเกิดข้อผิดพลาดหรือไม่ การจัดการ error เหล่านี้ช่วยป้องกันโปรแกรมทำงานผิดพลาด
การจัดการอินพุตที่ไม่ถูกต้อง
หากสตริงมีรูปแบบไม่ถูกต้อง การแปลงจะล้มเหลว เช่นสตริง “123abc” จะแปลงเฉพาะเลข 123 ส่วนที่เหลือจะถูกละเว้น เพื่อป้องกันปัญหานี้ strtol()
สามารถตรวจสอบตำแหน่งที่แปลงได้ด้วย pointer
char *endptr;
long num = strtol(str, &endptr, 10);
if (*endptr != ' ') {
printf("มีอินพุตไม่ถูกต้อง\n");
}
6. สรุป
การตรวจสอบข้อผิดพลาดและเลือกวิธีแปลงที่ปลอดภัย มีความสำคัญต่อเสถียรภาพของโปรแกรม ถึงแม้ atoi()
จะใช้ง่าย แต่ไม่รองรับการจัดการ error ดังนั้นแนะนำให้ใช้ strtol()
หรือ sscanf()
, snprintf()
แทน
การแปลงระหว่างสตริงและตัวเลขในภาษา C เป็นทักษะพื้นฐานสำหรับโปรแกรมเมอร์ หากฝึกฝนทักษะนี้จะสามารถพัฒนาโปรแกรมที่มีความเสถียรสูงขึ้นได้ รวมถึงช่วยให้จัดการข้อผิดพลาดและหน่วยความจำได้อย่างมีประสิทธิภาพ ส่งผลให้โปรแกรมปลอดภัยมากขึ้น
แหล่งความรู้เพิ่มเติม
หากต้องการศึกษาหัวข้อนี้เพิ่มเติม แนะนำให้อ่านเอกสาร official หรือดูตัวอย่างโค้ดจากโปรเจกต์โอเพนซอร์ส รวมถึงหนังสือเกี่ยวกับการจัดการ error และหน่วยความจำในภาษา C