String ฟังก์ชัน ในภาษา C
ในบทก่อนหน้า คุณได้เรียนรู้พื้นฐานเกี่ยวกับสตริง (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 ทั้งสองมีค่าเท่ากัน ในการทำงานของฟังก์ชันนั้น จะทำการเปรียบเทียบทีละตัวโดยเริ่มจากตัวแรก
- นำตัวอักษรตัวแรกของแต่ละ String มาเปรียบเทียบกัน ถ้าทางซ้ายน้อยกว่า จะได้คำตอบเป็น
-1
หรือทางขวามากกว่า จะได้คำตอบเป็น1
และจบการเปรียบเทียบ - แต่ถ้าหากเท่ากัน เลื่อนไปยังตัวอักษรตำแหน่งถัดไป ถ้าทางซ้ายน้อยกว่า จะได้คำตอบเป็น
-1
หรือทางขวามากกว่า จะได้คำตอบเป็น1
และจบการเปรียบเทียบ - ในขณะที่ตัวอักษรยังเท่ากัน วนกลับไปทำข้อ 2 เรื่อยๆ จนกว่าจะสิ้นสุด String
- ถ้าเปรียบเทียบจนครบทุกตัวแล้วเท่ากันทั้งหมด จะได้คำตอบเป็น
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