การแปลงสตริงและตัวเลขในภาษา C: คู่มือฉบับสมบูรณ์สำหรับมือใหม่

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

侍エンジニア塾