Mảng các chuỗi trong C

Xin chào các bạn đang học lập trình! Hôm nay, chúng ta sẽ bắt đầu một hành trình đầy thú vị vào thế giới lập trình C, cụ thể là khám phá khái niệm Mảng các chuỗi. Đừng lo lắng nếu bạn hoàn toàn mới bắt đầu học lập trình; tôi sẽ hướng dẫn bạn từng bước với cùng sự chăm sóc và kiên nhẫn mà tôi đã sử dụng trong lớp học trong nhiều năm. Vậy, chúng ta cùng bắt đầu nhé!

C - Array of Strings

Mảng các chuỗi là gì trong C?

Hãy tưởng tượng bạn đang sắp xếp một kệ sách. Mỗi kệ có thể chứa nhiều sách, phải không? Trong lập trình C, Mảng các chuỗi hoạt động tương tự. Nó giống như một bộ sưu tập các kệ (mảng) mà mỗi kệ chứa một cuốn sách (một chuỗi).

Trong thuật ngữ kỹ thuật, một Mảng các chuỗi trong C là một ma trận hai chiều của các ký tự. Đây là cách để lưu trữ nhiều chuỗi trong một biến duy nhất. Mỗi chuỗi trong mảng này cơ bản là một mảng một chiều của các ký tự.

Hãy phân tích nó bằng một ví dụ đơn giản:

  • Nếu một chuỗi là như một từ, thì một mảng các chuỗi là như một câu.
  • Nếu một chuỗi là như một tựa sách, thì một mảng các chuỗi là như một danh mục các tựa sách.

Khai báo và Khởi tạo một Mảng các Chuỗi

Bây giờ, hãy học cách tạo ra "kệ sách" của chúng ta trong C. Dưới đây là cách chúng ta khai báo và khởi tạo một mảng các chuỗi:

char books[3][20] = {
"C Programming",
"Python Basics",
"Java for Beginners"
};

Trong ví dụ này:

  • books là tên của mảng của chúng ta
  • [3] cho thấy chúng ta đang lưu trữ 3 chuỗi
  • [20] có nghĩa là mỗi chuỗi có thể dài lên tới 20 ký tự
  • Chúng ta đã khởi tạo nó với ba tựa sách

Lưu ý rằng trong C, các chuỗi luôn được kết thúc bằng ký tự null '\0', vì vậy hãy chắc chắn rằng bạn đã分配 đủ không gian cho nó!

In một Mảng các Chuỗi

Bây giờ chúng ta đã có kệ sách của mình, hãy học cách hiển thị nội dung của nó. Chúng ta có thể sử dụng một vòng lặp đơn giản để in mỗi chuỗi:

#include <stdio.h>

int main() {
char books[3][20] = {
"C Programming",
"Python Basics",
"Java for Beginners"
};

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

return 0;
}

Chương trình này sẽ in ra:

C Programming
Python Basics
Java for Beginners

Ở đây, books[i] cho chúng ta chuỗi thứ i trong mảng. Cờ %s trong printf cho biết printf mong đợi một chuỗi.

Mảng các Chuỗi được Lưu trữ như thế nào trong Bộ Nhớ?

Bây giờ, hãy nhìn sau màn curtain và xem kệ sách của chúng ta thực sự được tổ chức như thế nào trong bộ nhớ của máy tính.

Một mảng các chuỗi trong C được lưu trữ như một khối bộ nhớ liên tục. Mỗi chuỗi chiếm một lượng không gian cố định (trong ví dụ của chúng ta, 20 ký tự), bất kể độ dài thực tế của nó.

Dưới đây là một hình ảnh trực quan:

Địa chỉ Bộ Nhớ | Nội dung
---------------|-----------------
0x1000         | C Programming\0...
0x1014         | Python Basics\0...
0x1028         | Java for Beginners\0

Mỗi hàng đại diện cho một chuỗi, và chúng được lưu trữ liên tiếp trong bộ nhớ.

Mảng các Chuỗi với các Con Trỏ

Khi bạn tiến hóa trong C, bạn sẽ gặp một cách linh hoạt hơn để tạo một mảng các chuỗi sử dụng các con trỏ:

char *books[] = {
"C Programming",
"Python Basics",
"Java for Beginners"
};

Phương pháp này cho phép các chuỗi có độ dài khác nhau, vì mỗi phần tử của books là một con trỏ đến một chuỗi, thay vì một mảng cố định kích thước.

Tìm Chuỗi Dài Nhất

Hãy áp dụng kiến thức của chúng ta vào một ví dụ thực tế. Dưới đây là một chương trình để tìm chuỗi dài nhất trong mảng của chúng ta:

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

int main() {
char *books[] = {
"C Programming",
"Python Basics",
"Java for Beginners"
};
int n = sizeof(books) / sizeof(books[0]);
int max_length = 0;
char *longest_book = NULL;

for(int i = 0; i < n; i++) {
int length = strlen(books[i]);
if(length > max_length) {
max_length = length;
longest_book = books[i];
}
}

printf("Tựa sách dài nhất là: %s\n", longest_book);
return 0;
}

Chương trình này sẽ output:

Tựa sách dài nhất là: Java for Beginners

Sắp Xếp một Mảng các Chuỗi theo Thứ Tự Tăng Dần

Cuối cùng, hãy thử thách cuối cùng, hãy sắp xếp mảng các chuỗi của chúng ta theo thứ tự alphabet:

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

int main() {
char *books[] = {
"C Programming",
"Python Basics",
"Java for Beginners"
};
int n = sizeof(books) / sizeof(books[0]);

for(int i = 0; i < n-1; i++) {
for(int j = i+1; j < n; j++) {
if(strcmp(books[i], books[j]) > 0) {
char *temp = books[i];
books[i] = books[j];
books[j] = temp;
}
}
}

printf("Danh sách sách đã được sắp xếp:\n");
for(int i = 0; i < n; i++) {
printf("%s\n", books[i]);
}

return 0;
}

Chương trình này sẽ output:

Danh sách sách đã được sắp xếp:
C Programming
Java for Beginners
Python Basics

Chúng ta đã sử dụng thuật toán bubble sort ở đây, so sánh các chuỗi liền kề bằng strcmp() và hoán đổi chúng nếu chúng ở sai thứ tự.

Và thế là xong! Chúng ta đã khám phá thế giới của Mảng các Chuỗi trong C, từ khái niệm cơ bản đến các ứng dụng thực tế. Nhớ rằng, lập trình giống như học một ngôn ngữ mới - nó đòi hỏi sự luyện tập và kiên nhẫn. Đừng nản lòng nếu bạn không hiểu ngay lập tức. Hãy tiếp tục lập trình, tiếp tục thử nghiệm, và quan trọng nhất, hãy vui vẻ!

Phương pháp Mô tả
strlen() Tính toán độ dài của một chuỗi
strcmp() So sánh hai chuỗi
strcpy() Sao chép một chuỗi vào một chuỗi khác
strcat() Kết hợp hai chuỗi
strtok() Chia một chuỗi thành các token

Những hàm manipulacion chuỗi này sẽ là bạn đồng hành tốt nhất của bạn khi bạn tiếp tục hành trình lập trình C. Chúc các bạn may mắn!

Credits: Image by storyset