String ฟังก์ชัน ในภาษา C

20 July 2020

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

  • การหาความยาวของ String (strlen)
  • การคัดลอก String (strcpy)
  • การเชื่อมต่อ String (strcat)
  • การเปรียบเทียบ String (strcmp)
  • การค้นหาภายใน String (strchr, strstr)
  • การจัดเรียงอาเรย์ของ String

การหาความยาวของ String

เมื่อเราทำงานกับ String สิ่งหนึ่งที่เรามักจะทำอยู่เสมอก็คือต้องการทราบว่า String มีความยาวเท่าไหร่ ในภาษา C เราใช้ฟังก์ชัน strlen สำหรับหาความยาวของ String ได้ นี่เป็นตัวอย่าง

#include <stdio.h>
#include <string.h>

int main()
{
    char name[] = "Mateo";
    int length = strlen(name);
    printf("\"%s\" is %d characters string\n", name, length);
    printf("Length of \"C Language\" is %d\n", strlen("C Language"));
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

"Mateo" is 5 characters string
Length of "C Language" is 10

ในตัวอย่าง เราได้ประกาศตัวแปร name ที่ใช้สำหรับเก็บชื่อ จากนั้นเรียกใช้งานฟังก์ชัน strlen เพื่อหาความยาวของ String ฟังก์ชันนี้จะส่งค่ากลับเป็นตัวเลขจำนวนเต็ม ซึ่งเป็นจำนวนตัวอักษรทั้งหมดใน String

printf("\"%s\" is %d characters string\n", name, length);
printf("Length of \"C Language\" is %d\n", strlen("C Language"));

หลังจากนั้นเราแสดงค่าของ String และความยาวของมันออกทางหน้าจอ สังเกตว่าในการแสดงผลบรรทัดที่สอง เราสามารถส่งค่า String literal "C Language" เข้าไปยังฟังก์ชัน strlen ได้โดยตรง

ตัวอย่างถัดมา เรามักจะหาความยาวของ String ในกรณีที่เราต้องการวนรอบตัวอักษรภายใน String เพื่อทำงานบางอย่างกับมัน ดังนั้นเราจึงจำเป็นต้องทราบว่าความยาวของ String เป็นเท่าไหร่ เพื่อใช้สร้างเงื่อนไขให้กับคำสั่ง for นี่เป็นตัวอย่าง

#include <stdio.h>
#include <string.h>

int main()
{
    char sitename[] = "marcuscode";

    printf("CHAR\tDEC\n");
    for (int i = 0; i < strlen(sitename); i++) {
        printf("%c\t%d\n", sitename[i], sitename[i]);
    }
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

CHAR    DEC
m       109
a       97
r       114
c       99
u       117
s       115
c       99
o       111
d       100
e       101

ในตัวอย่าง เป็นโปรแกรมสำหรับวนรอบ String เพื่อนำเอาตัวอักษรแต่ละตัวใน String มาแสดงเป็นตารางของตัวอักษรและรหัสแอสกิี้ในเลขฐานสิบของมัน

for (int i = 0; i < strlen(sitename); i++) {

คำสั่ง for loop เริ่มทำงานจากค่า i ที่เป็น 0 จนถึง i < strlen(sitename) ซึ่งหมายความว่าโปรแกรมจะวนอ่านตัวอักษรภายใน String จากค่าตำแหน่ง 0 - 9 เนื่องจากว่าความยาวของ String นั้นมีค่าเท่ากับ 10

การคัดลอก String ไปยังตัวแปรใหม่

ในประเภทข้อมูลพื้นฐาน (Primitive data type) เราสามารถคัดลอกค่าของตัวแปรหนึ่งไปยังอีกตัวแปรหนึ่งได้โดยการใช้ตัวดำเนินการกำหนดค่า = ยกตัวอย่างเช่น

int a = 10;
int b = a;

นี่เป็นคำสั่งที่ถูกต้อง เราได้ประกาศตัวแปร a และหลังจากนั้นคัดลอกค่าในตัวแปร a ไปเก็บไว้ในตัวแปร b ทั้งสองตัวแปรมีค่าเป็น 10

แต่การทำเช่นนี้จะใช้ไม่ได้กับ String ยกตัวอย่างเช่น

char name[] = "Mateo";
char another_name[] = name; // Error

เนื่องจาก String เป็นอาเรย์ ดังนั้นเราไม่สามารถใช้ตัวดำเนินการกำหนดค่ากับอาเรย์ได้ อย่างไรก็ตาม ในภาษา C มีฟังก์ชัน strcpy ที่ให้เราสามารถคัดลอก String ไปยังตัวแปรอื่นได้ ดังนั้นถ้าหากคุณต้องการสร้าง String ที่มีค่าเหมือนกับ String อื่น คุณอาจจะต้องใช้ฟังก์ชันนี้

#include <stdio.h>
#include <string.h>

int main()
{
    char name[] = "Mateo";
    char another_name[10];

    strcpy(another_name, name);

    printf("name: %s\n", name);
    printf("another_name: %s\n", another_name);
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

name: Mateo
another_name: Mateo

ในตัวอย่าง เราได้ใช้ฟังก์ชัน strcpy สำหรับคัดลอกค่าในตัวแปร name ไปยังตัวแปร another_name

เนื่องจากเราเป็นโปรแกรมเมอร์ และเราอาจจะต้องการบางอย่างที่ท้าทาย ในความเป็นจริงแล้วคุณสามารถคัดลอก String ด้วยตัวเองโดยการเขียนคำสั่ง for loop เพื่อคัดลอกแต่ละตัวอักษรในอาเรย์ไปยังตัวแปรใหม่ นี่เป็นตัวอย่าง

#include <stdio.h>
#include <string.h>

int main()
{
    char name[] = "Mateo";
    char another_name[10];

    // same as strcpy
    for (int i = 0; i < strlen(name); i++) {
        another_name[i] = name[i];
    }

    printf("name: %s\n", name);
    printf("another_name: %s\n", another_name);
    return 0;
}

ในตัวอย่าง เราได้ใช้คำสั่ง for loop เพื่อคัดลอกข้อความในตัวแปร name ไปยังตัวแปร another_name ซึ่งผลลัพธ์ที่ได้นั้นเหมือนกับฟังก์ชัน strcpy แต่ฟังก์ชัน strcpy อาจจะใช้เทคนิคอื่นในการคัดลอก เช่น พอยน์เตอร์

การเชื่อมต่อ String

การเชื่อมต่อ String คือการนำสอง String มาเชื่อมต่อกันเพื่อให้ได้ String ใหม่ ในภาษา C เราสามารถใช้ฟังก์ชัน strcat เพื่อเชื่อมต่อสอง String เข้าด้วยกันได้ นี่เป็นตัวอย่างการใช้งาน

#include <stdio.h>
#include <string.h>

int main()
{
    char sitename[] = "marcuscode";
    char tld[] = ".com";

    strcat(sitename, tld);
    printf("%s", sitename);
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

marcuscode.com

ในตัวอย่าง เรามีตัวแปร String สองตัวที่เก็บชื่อเว็บไซต์และนามสกุลโดเมนของมัน เราเรียกใช้ฟังก์ชัน strcate เพื่อเชื่อมต่อ String ทั้งสองเข้าด้วยกัน

strcat(sitename, tld);

โดยการทำงานของฟังก์ชันนั้นจะทำการเชื่อมต่อพารามิเตอร์ที่สอง tld เข้ากับพารามิเตอร์ตัวแรก sitename ผลลัพธ์การทำงานของฟังก์ชันจะทำให้ค่าเดิมในตัวแปร name เปลี่ยนไปเป็น String ที่ได้รับการเชื่อมต่อแล้ว

จากในตัวอย่างก่อนหน้า เมื่อเราทำการเชื่อมต่อสอง String เข้าด้วยกัน ตัวแปร name ได้กลายมาเป็นค่าใหม่ของ String หลังจากการเชื่อมต่อ ในบางครั้งเราอาจจะต้องการรักษาค่าเดิมของ String เอาไว้ เพื่อใช้ในภายหลังของโปรแกรม มาดูเทคนิคสำหรับการทำเช่นนี้

#include <stdio.h>
#include <string.h>

int main()
{
    char firstname[] = "Mateo";
    char lastname[] = "Marcus";
    char fullname[30];

    strcat(fullname, firstname);
    strcat(fullname, " ");
    strcat(fullname, lastname);

    printf("First: %s\n", firstname);
    printf("Last: %s\n", lastname);
    printf("Full name: %s\n", fullname);
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

First: Mateo
Last: Marcus
Full name: Mateo Marcus

ในตัวอย่าง เรามีตัวแปร String สองตัวสำหรับเก็บชื่อและนามสกุล ในตัวอย่างนี้ เราต้องการสร้างชื่อเต็มโดยการนำ String ทั้งสองมาเชื่อมต่อกันโดยที่ค่าเดิมในตัวแปรยังอยู่เหมือนเดิม

char fullname[30];

เพื่อทำเช่นนี้ เราได้ประกาศตัวแปร fullname ซึ่งเป็นอาเรย์ว่างเปล่าสำหรับเก็บค่าของ String หลังจากการเชื่อมต่อ และกำหนดขนาดให้กับ String ซึ่งควรจะเป็นขนาดที่เพียงพอสำหรับเก็บข้อความหลังจากการเชื่อมต่อทั้งหมด

strcat(fullname, firstname);
strcat(fullname, " ");
strcat(fullname, lastname);

จากนั้นเราเรียกใช้ฟังก์ชัน strcat เพื่อเชื่อมต่อ String โดยการใช้ตัวแปร fullname เพื่อเป็นตัวแปรเป้าหมายในการเชื่อมต่อ โดยการกำหนดมันเป็นพารามิเตอร์แรกของฟังก์ชัน ทุกครั้งที่เรียกใช้ฟังก์ชันค่า String ในพารามิเตอร์ที่สองจะถูกนำไปต่อเข้ากับตัวแปร fullname เรื่อยๆ

printf("First: %s\n", firstname);
printf("Last: %s\n", lastname);
printf("Full name: %s\n", fullname);

สุดท้ายเราได้ String ใหม่ที่เกิดจากการเชื่อมต่อของ String อื่นโดยที่ค่าในตัวแปร firstname และ lastname ยังคงไม่เปลี่ยนแปลง

การเปรียบเทียบ String

สิ่งที่พบได้บ่อยที่สุดเมื่อทำงานกับ String ก็คือการเปรียบเทียบ String เพื่อตรวจสอบว่าค่าของมันเท่ากันหรือไม่ ในภาษา C เราไม่สามารถใช้ตัวดำเนินการเปรียบเทียบ == ในการเปรียบเทียบ String โดยตรงได้ ยกตัวอย่างเช่น

char username[] = "Mateo";
if (username == "Mateo") {
    printf("Equal"); // Doesn't work
}

โดยทั่วไปแล้วคนที่เพิ่งจะเรียนรู้ภาษา C มักจะทำข้อผิดพลาดนี้ เมื่อพวกเขาคิดว่าสามารถใช้ตัวดำเนินการเปรียบเทียบ == ในการเปรียบเทียบ String ได้ แต่โชคดีที่ในภาษา C นั้นมีฟังก์ชัน strcmp ที่ให้เราสามารถใช้เปรียบเทียบ String ได้ นี่เป็นรูปแบบการใช้งานของฟังก์ชันดังกล่าว

int strcmp (const char * str1, const char * str2);

โดยที่ฟังก์ชันรับค่าเป็น String สองตัวที่ต้องการเปรียบเทีียบกัน และมันส่งค่ากลับเป็นจำนวนเต็มที่มีความหมายดังต่อไปนี้

  • -1 ถ้าหากว่า str1 มีค่าน้อยกว่า str2
  • 0 ถ้าหากว่า str1 มีค่าเท่ากับ str2
  • 1 ถ้าหากว่า str1 มีค่ามากกว่า str2

กล่าวคือเราสามารถใช้งานฟังก์ชัน strcmp เพื่อตรวจสอบว่า String มีค่าเท่ากัน น้อยกว่า หรือมากกว่าได้ ดังนั้นจากตัวอย่างก่อนหน้า เราสามารถเขียนใหม่ได้เป็น

#include <stdio.h>
#include <string.h>

int main()
{
    char username[] = "Mateo";
    if (strcmp(username, "Mateo") == 0) {
        printf("Equal");
    } else {
        printf("Not equal");
    }
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Equal

ดังนั้นเพื่อตรวจสอบว่า String ทั้งสองมีค่าเท่ากันหรือไม่ เราจึงต้องทำการตรวจสอบผลลัพธ์ของฟังก์ชัน strcmp ว่าเท่ากับ 0 หรือไม่ ในการทำงานภายในของฟังก์ชัน การที่ String ทั้งสองมีค่าเท่ากันหมายความว่ามันมีความยาวของตัวอักษรเท่ากัน และตัวอักษรในทุกตำแหน่งตรงกัน

การเปรียบว่า String เท่ากันหรือไม่นั้นเป็นการทำงานพื้นฐานเกี่ยวกับ String ต่อไปมาดูตัวอย่างเพิ่มเติมในการเปรียเทียบว่า String น้อยกว่าหรือมากกว่า

#include <stdio.h>
#include <string.h>

int main()
{
    printf("%d\n", strcmp("a", "b"));       // -1
    printf("%d\n", strcmp("US", "UK"));     //  1
    printf("%d\n", strcmp("cat", "bat"));   // 1
    printf("%d\n", strcmp("js", "java"));   // 1
    printf("%d\n", strcmp("marcus", "marcuscode")); // -1
    printf("%d\n", strcmp("D", "c"));       // -1
    printf("%d\n", strcmp("123", "abc"));   // -1
    return 0;
}

ในตัวอย่าง เป็นการเปรียบเทียบค่าต่างๆ ของ String เพื่อตรวจสอบดูว่า String เท่ากับ น้อยกว่า หรือมากกว่า เราได้คอมเมนต์คำตอบไว้ที่ด้านหลังบรรทัดสำหรับแต่ละคำสั่ง ต่อไปมาดูคำอธิบายในแต่ละคำสั่ง

printf("%d\n", strcmp("a", "b"));       // -1
printf("%d\n", strcmp("US", "UK"));     //  1
printf("%d\n", strcmp("cat", "bat"));   // 1

ในสามคำสั่งแรก เป็นการเปรียบเทียบอย่างง่ายโดยที่ความยาวของString ทั้งสองมีค่าเท่ากัน ในการทำงานของฟังก์ชันนั้น จะทำการเปรียบเทียบทีละตัวโดยเริ่มจากตัวแรก

  1. นำตัวอักษรตัวแรกของแต่ละ String มาเปรียบเทียบกัน ถ้าทางซ้ายน้อยกว่า จะได้คำตอบเป็น -1 หรือทางขวามากกว่า จะได้คำตอบเป็น 1 และจบการเปรียบเทียบ
  2. แต่ถ้าหากเท่ากัน เลื่อนไปยังตัวอักษรตำแหน่งถัดไป ถ้าทางซ้ายน้อยกว่า จะได้คำตอบเป็น -1 หรือทางขวามากกว่า จะได้คำตอบเป็น 1 และจบการเปรียบเทียบ
  3. ในขณะที่ตัวอักษรยังเท่ากัน วนกลับไปทำข้อ 2 เรื่อยๆ จนกว่าจะสิ้นสุด String
  4. ถ้าเปรียบเทียบจนครบทุกตัวแล้วเท่ากันทั้งหมด จะได้คำตอบเป็น 0 ซึ่งหมายความว่า String มีค่าเท่ากัน
printf("%d\n", strcmp("js", "java"));   // 1

ในคำสั่งต่อมา เนื่องจากว่า String ทางด้านซ้ายนั้นสิ้นสุดก่อนเพราะมันมีแค่สองตัวอักษร การเปรียบเทียบจะทำถึงแค่ตำแหน่งที่สอง เนื่องจากตำแหน่งที่สองของทางซ้าย 's' มากกว่าทางขวา 'a' ดังนั้นจะถือว่า String ทางซ้าย "js" มีค่ามากกว่า "java" ถึงแม้ว่ามันจะมีความยาวน้อยกว่า

printf("%d\n", strcmp("marcus", "marcuscode")); // -1

ในกรณีที่มี String ใด String หนึ่งสิ้นสุดก่อน และการเปรียบเทียบในแต่ละตำแหน่งนั้นมีค่าเท่ากัน จะถือว่า String ที่สั้นกว่ามีค่าน้อยกว่าเสมอ

printf("%d\n", strcmp("D", "c"));       // -1
printf("%d\n", strcmp("123", "abc"));   // -1

สำหรับสองคำสั่งสุดท้ายคุณอาจสงสัยว่าทำไม "D" จึงมีค่าน้อยกว่า "c" ถึงแม้ว่าตัวอักษร "c" จะมาก่อนตัวอักษร "D" แต่การเปรียบเทียบ String ในภาษา C นั้นจะใช้ลำดับของรหัสแอสกีในการเปรียบเทียบ ทุกตัวอักษรในภาษา C จะมีรหัสและตารางบอกว่าตัวอักษรไหนมาก่อนและหลัง

ตารางต่อไปนี้แสดงให้คุณเห็นตัวอักษร และรหัสแอสกีในเลขฐานสิบของมัน

CHAR    DEC
0       48
1       49
2       50
3       51
4       52
...
A       65
B       66
C       67
D       68
E       69
...
a       97
b       98
c       99
d       100
e       101

และอย่างที่คุณเห็น เนื่องจากตัวอัษร 'D' ซึ่งเป็นตัวพิมพ์ใหญ่มีรหัสเป็น 68 ซึ่งน้อยกว่าตัวอักษร 'c' ซึ่งมีรหัสเป็น 99 ดังนั้นจึงถือว่ามันน้อยกว่านั่นเอง และสำหรับลำดับของตัวเลขจะมาก่อนตัวอักษรทุกตัวเสมอ นั่นจึงเป็นเหตุผลว่าทำไม "123" น้อยกว่า "abc"

Info: ตัวอักษรในภาษา C นั้นใช้การเข้ารหัสเป็น ASCII ขนาด 8 บิตในการเก็บข้อมูล นั่นหมายความว่าตัวอักษรทั้งหมดที่เป็นไปได้จะมีเพียงแค่ 265 ตัวอักษร คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ ASCII ได้ที่ https://en.wikipedia.org/wiki/ASCII

โค้ดต่อไปนี้แสดงตารางของ ASCII ทั้งหมดในภาษา C

#include <stdio.h>

int main()
{
    printf("DEC\tCHAR\n");
    for (int dec = 0; dec < 256; dec++) {
       printf("%d\t%c\n", dec, dec);
    }
    return 0;
}

การค้นหาภายใน String

ในตัวอย่างต่อมาเป็นการใช้งานฟังก์ชันเพื่อตรวจสอบ String ย่อยหรือตัวอักษรว่ามันปรากฏอยู่ใน String หรือไม่ ในบทนี้เราจะแนะนำให้รู้จักกับสองฟังก์ชันคือ strchr และ strstr

ถ้าหากเราต้องการตรวจสอบว่าภายใน String นั้นมีตัวอักษรที่ต้องการหาอยู่หรือไม่ ฟังก์ชัน strchr จะถูกใช้งาน มันใช้สำหรับค้นหาว่าตัวอักษร (เพียงหนึ่งตัว) อยู่ภายใน String หรือไม่ นี่เป็นตัวอย่าง

#include <stdio.h>
#include <string.h>

int main()
{
    char str[] = "marcuscode.com";
    char* p = strchr(str, '.');

    if (p != NULL) {
        printf("Looking for %c\n", *p);
        printf("Found at position %d\n", p - str);
    } else {
        printf("Not found");
    }
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Looking for .
Found at position 10

ในตัวอย่าง เรามี String ที่เป็นชื่อของเว็บไซต์ "marcuscode.com" เก็บไว้ในตัวแปร และเราต้องการตรวจสอบว่าภายใน String ดังกล่าวมีเครื่องหมายจุด . อยู่หรือไม่

char* p = strchr(str, '.');

เราเรียกใช้งานฟังก์ชัน strchr สำหรับการค้นหา พารามิเตอร์แรกเป็น String ตั้งต้นที่เราต้องการค้นหา และพารามิเตอร์ที่สองเป็นตัวอักษรที่ต้องการค้นหาว่าอยู่ภายใน String หรือไม่ ฟังก์ชันส่งค่ากลับเป็นพอยน์เตอร์ชี้ไปยังตำแหน่งในตัวแปร str ที่ตัวอักษรจุด . อยู่

if (p != NULL) {

แต่ถ้าหากไม่พบค่าที่ส่งกับจะเป็น NULL พอยน์เตอร์แทน ดังนั้นเราสามารถรู้ได้จากการตรวจสอบพอยน์เตอร์ว่าเป็น NULL พอยน์เตอร์หรือไม่ ถ้าหากไม่ใช่นั่นหมายความว่าการค้นหาได้ถูกพบ

printf("Looking for %c\n", *p);
printf("Found at position %d\n", p - str);

หลังจากนั้นเราแสดงค่าที่พอยน์เตอร์ชี้อยู่ด้วย *p ซึ่งเป็นการเข้าถึงค่าที่พอยน์เตอร์ (ในที่นี้คือตัวอักษรจุด) และตำแหน่งของมันที่ปรากฏอยู่ภายใน String โดยการนำที่อยู่ในหน่วยความจำของพอยน์เตอร์ลบออกจากที่อยู่ในหน่วยความจำของอาเรย์ p - str

ในขณะที่ฟังก์ชัน strchr ใช้สำหรับตรวจสอบว่าตัวอักษรหนึ่งตัวอยู่ภายใน String หรือไม่ เราสามารถใช้ฟังก์ชัน strstr เพื่อตรวจสอบว่ามี String หรือ String ย่อยปรากฏอยู่ภายใน String ที่ต้องการค้นหาหรือไม่ นี่เป็นตัวอย่าง

#include <stdio.h>
#include <string.h>

int main()
{
    char str[] = "I have 3 apples in the basket";
    char search[] = "apples";

    char* p = strstr(str, search);

    if (p != NULL) {
        printf("Looking for \"%s\"\n", search);
        printf("Found at position %d\n", p - str);
    } else {
        printf("Not found");
    }
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Looking for "apples"
Found at position 9

ในตัวอย่าง เป็นการค้นหาว่าข้อความ "apples" ปรากฏอยู่ภายในตัวแปร str หรือไม่ โดยการใช้ฟังก์ชัน strstr

char* p = strstr(str, search);

พารามิเตอร์แรกเป็น String ตั้งต้นที่เราต้องการค้นหา และพารามิเตอร์ที่สองเป็น String ย่อยที่เราต้องการค้นหาว่ามีอยู่ภายใน str หรือไม่

if (p != NULL) {
    printf("Looking for \"%s\"\n", search);
    printf("Found at position %d\n", p - str);
}

เช่นเดียวกันกับฟังก์ชัน strchr ฟังก์ชันนี้ส่งค่ากลับเป็นพอยน์เตอร์ที่ชี้ไปยังตำแหน่งที่พบ search ในตัวแปร str และส่งค่ากลับเป็น NULL พอยน์เตอร์ถ้าหากไม่พบ และเราแสดง String และตำแหน่งของมันออกทางหน้าจอถ้าหากพบ

ตัวอย่างการจัดเรียงรายชื่อตาม Dictionary

เรามีรายชื่อของผู้คนจำนวนหนึ่งในอาเรย์และเราต้องการชื่อเหล่านั้นตามพจนานุกรม (ในกรณีนี้ตามรหัสแอสกิ) ดังนั้นในตัวอย่างนี้เราจะมาเขียนโปรแกรมสำหรับจัดเรียง String ในอาเรย์จากน้อยไปมาก การทำงานของมันจะคล้ายกับสมุดโทรศัพท์ ที่ชื่อขึ้นต้นด้วยอักษร 'A' จะแสดงก่อน และตัวอักษร 'Z' จะแสดงท้ายสุด นี่เป็นตัวอย่างของโปรแกรม

#include <stdio.h>
#include <string.h>

int main()
{
    int n = 5;
    char names[n][20];
    char temp[20];

    printf("Enter %d names:\n", n);
    for (int i = 0; i < n; i++) {
        printf("%d: ", i + 1);
        scanf("%s", names[i]);
    }

    // Bubble sort
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (strcmp(names[j], names[j + 1]) == 1) {
                strcpy(temp, names[j]);
                strcpy(names[j], names[j + 1]);
                strcpy(names[j + 1], temp);
            }
        }
    }

    printf("Sorted names:\n");
    for (int i = 0; i < n; i++) {
        printf("%s\n", names[i]);
    }

    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม เราได้กรอกชื่อเข้ามา 5 รายชื่อตามที่โปรแกรมถาม และมันจัดเรียงให้เราตามตัวอักษร

Enter 5 names:
1: Mateo
2: Danny
3: Andril
4: Georgie
5: Chris
Sorted names:
Andril
Chris
Danny
Georgie
Mateo

ในโค้ดตัวอย่าง เป็นโปรแกรมสำหรับถามให้กรอกชื่อเข้ามา 5 รายชื่อมาเก็บไว้ในอาเรย์ของ String จากนั้นเรานำรายชื่อเหล่านี้มาจัดเรียงด้วยอัลกอริทึม Bubble sort แล้วแสดงผลออกมาทางหน้าจอ

int n = 5;
char names[n][20];
char temp[20];

ในตอนแรก เราได้ประกาศตัวแปรที่จำเป็นต้องใช้งานภายในโปรแกรม ตัวแปร n กำหนดจำนวนรายชื่อที่ต้องการใส่เข้ามา ตัวแปร names เป็นอาเรย์สองมิติสำหรับเก็บรายชื่อทั้งหมด โดยที่แต่ละรายชื่อนั้นสามารถมีความยาวได้ไม่เกิน 20 ตัวอักษร ตัวแปร temp เป็นตัวแปรชั่วคราวสำหรับเอาไว้ให้สลับรายชื่อในตอนจัดเรียง

printf("Enter %d names:\n", n);
for (int i = 0; i < n; i++) {
    printf("%d: ", i + 1);
    scanf("%s", names[i]);
}

จากนั้นเราใช้คำสั่ง for loop วนรับค่าจำนวน n รายชื่อเข้ามาเก็บไว้ในอาเรย์ ในที่นี้เราวนเป็นจำนวน 5 รอบจากค่าในตัวแปร n

// Bubble sort
for (int i = 0; i < n - 1; i++) {
    for (int j = 0; j < n - i - 1; j++) {
        if (strcmp(names[j], names[j + 1]) == 1) {
            strcpy(temp, names[j]);
            strcpy(names[j], names[j + 1]);
            strcpy(names[j + 1], temp);
        }
    }
}

จากนั้นเราทำการเรียงรายชื่อในอารย์ด้วยอัลกอริทึม Bubble sort เราได้ทำการเปรียบเทียบรายชื่อที่อยู่ติดกันด้วยฟังก์ชัน strcmp ถ้าหากชื่อทางด้านซ้ายมากทางด้านขวา strcmp(names[j], names[j + 1]) == 1 ดังนั้นเราสลับชื่อนั้นไปทางขวา โดยการใช้ฟังก์ชัน strcpy มาช่วยในการสลับ

โปรแกรมจะวนรอบทำไปเรื่อยๆ จนกว่าการเปรียบเทียบจะครบทุกรายชื่อในอาเรย์ นั่นหมายความว่ารายชื่อทั้งหมดได้จัดเรียงในตำแหน่งที่ถูกต้องแล้ว

printf("Sorted names:\n");
for (int i = 0; i < n; i++) {
    printf("%s\n", names[i]);
}

ในตอนนี้เราได้รายชื่อที่ถูกจัดเรียงแล้วและแสดงผลมันออกมาทางหน้าจอ

ในตัวอย่างเป็นการเปรียบเทียบโดยการใช้ฟังก์ชัน strcmp นั่นหมายความว่าตัวอักษร Z จะมาก่อนตัวอักษร a เนื่องจากมันมีรหัสแอสกิที่น้อยกว่า ดังนั้น "Zeb" จะมาก่อน "andrill" เพื่อแก้ไขปัญหานี้ คุณสามารถใช้ฟังก์ชัน strcasecmp แทนฟังก์ชัน strcmp เพื่อเพิกเฉยระหว่างตัวอักษรพิมพ์เล็กและตัวอักษรพิมพ์ใหญ่ได้

ฟังก์ชันอื่นๆ เกี่ยวกับ String

นอกจากนี้ในไลบรารี่ string.h ยังมีฟังก์ชันอื่นๆ ที่เราสามารถใช้เพื่อตรวจสอบและจัดการกับ String ได้ และฟังก์ชันที่เราได้แสดงตัวอย่างให้ดูในบทนี้เป็นฟังก์ชันเพียงส่วนหนึ่งที่มีการใช้งานบ่อยๆ เท่านั้น สำหรับฟังก์ชันเพิ่มเติมเกี่ยวกับ String คุณสามารถดูได้ที่ http://www.cplusplus.com/reference/cstring/

ในบทนี้ เราได้แนะนำให้คุณรู้จักฟังก์ชันต่างๆ ในการเขียนโปรแกรมเพื่อทำงานกับ String ในภาษา C ซึ่งฟังก์ชันเหล่านี้เป็นฟังก์ชันมาตรฐานที่อยู่ในไลบรารี่ string.h

บทความนี้เป็นประโยชน์หรือไม่?Yes·No