Bài tập

Tìm hiểu về chuỗi (string) trong ngôn ngữ lập trình C và cách nhập xuất chuỗi trong C.

Huy Erick

Trong lập trình C, việc làm việc với chuỗi (string) là một khía cạnh quan trọng và phổ biến. Trong bài viết này, chúng ta sẽ tìm hiểu về các khái niệm cơ bản liên...

Trong lập trình C, việc làm việc với chuỗi (string) là một khía cạnh quan trọng và phổ biến. Trong bài viết này, chúng ta sẽ tìm hiểu về các khái niệm cơ bản liên quan đến chuỗi trong C và cách thức nhập xuất chuỗi thông qua các ví dụ.

Chuỗi trong lập trình C

Trước tiên, hãy tìm hiểu về khái niệm chuỗi trong lập trình C. Chuỗi là một tập hợp các ký tự được kết thúc bằng ký tự rỗng (null character - '\0'). Ví dụ:

char c[] = "c string";

Khi trình biên dịch gặp một chuỗi với các ký tự được đặt trong dấu [], nó sẽ tự động thêm ký tự rỗng vào cuối chuỗi.

Làm thế nào để khai báo chuỗi trong C?

Để khai báo một chuỗi ký tự trong C, bạn có thể sử dụng cách khai báo sau:

char s[5];

Trong ví dụ trên, tôi đã khai báo một chuỗi gồm 5 ký tự.

Cách khởi tạo chuỗi

Bạn có thể khởi tạo chuỗi theo một số cách sau đây:

char c[] = "abcd";
char c[50] = "abcd";
char c[] = {'a', 'b', 'c', 'd', '\0'};
char c[5] = {'a', 'b', 'c', 'd', '\0'};

Dưới đây là một ví dụ khác:

char c[5] = "abcde";

Trong ví dụ này, tôi đã thử gán 6 ký tự (ký tự cuối cùng là '\0') cho một mảng char có kích thước chỉ là 5 ký tự. Tuy nhiên, điều này làm cho chương trình không chạy đúng và tôi khuyến nghị bạn không nên thực hiện những thao tác tương tự như vậy.

Gán giá trị cho chuỗi

Mảng ký tự trong C (char array) và chuỗi ký tự (string) là hai thực thể có cấp độ bằng nhau trong lập trình C. Tuy nhiên, chúng không hỗ trợ toán tử gán khi chúng được khai báo. Ví dụ:

char c[100];
c = "C programming"; // Lỗi! Loại mảng không thể gán giá trị.

Lưu ý: Bạn có thể sử dụng hàm strcpy() để sao chép một chuỗi sang một chuỗi khác.

Đọc chuỗi từ người dùng nhập vào

Bạn có thể sử dụng hàm scanf() để đọc một chuỗi từ người dùng.

Hàm scanf() đọc một chuỗi ký tự cho đến khi gặp khoảng trắng (dấu cách, dòng mới, tab, ...).

Ví dụ 1: Sử dụng hàm scanf() để đọc một chuỗi

#include 

int main()
{
    char name[20];
    printf("Nhập tên: ");
    scanf("%s", name);
    printf("Tên của bạn là %s.", name);
    return 0;
}

Đầu ra:

Nhập tên: Dennis Ritchie
Tên của bạn là Dennis.

Mặc dù tôi đã nhập "Dennis Ritchie" vào chương trình nhưng chỉ có "Dennis" được lưu trữ trong mảng name. Điều này xảy ra vì có một khoảng trắng sau từ "Dennis".

Làm thế nào để đọc một dòng văn bản?

Bạn có thể sử dụng hàm fgets() để đọc một dòng trong chuỗi và sử dụng hàm puts() để hiển thị chuỗi.

Ví dụ 2: Sử dụng hàm fgets() và puts()

#include 

int main()
{
    char name[30];
    printf("Nhập tên: ");
    fgets(name, sizeof(name), stdin); // Đọc chuỗi từ người dùng
    printf("Tên: ");
    puts(name); // Hiển thị chuỗi
    return 0;
}

Đầu ra:

Nhập tên: Tom Hanks
Tên: Tom Hanks

Trong ví dụ trên, tôi sử dụng hàm fgets() để đọc một chuỗi do người dùng nhập vào. Kích thước của mảng name là 30. Do đó, tôi có thể nhập tối đa 30 ký tự và đó cũng chính là kích thước của chuỗi name.

Để hiển thị chuỗi, tôi sử dụng hàm puts(name).

Lưu ý: Hàm gets() cũng có chức năng lấy đầu vào từ người dùng. Tuy nhiên, đây không phải là một hàm tiêu chuẩn trong lập trình C.

Điều này là do hàm gets() cho phép bạn nhập một chuỗi có độ dài ký tự không giới hạn. Điều này có thể dẫn đến tràn bộ nhớ đệm.

Truyền chuỗi vào hàm

Chuỗi trong C có thể được truyền vào hàm giống như mảng. Xem thêm cách truyền mảng vào hàm tại đây.

Ví dụ 3: Truyền một chuỗi vào một hàm

#include 

void displayString(char str[]);

int main()
{
    char str[50];
    printf("Nhập chuỗi: ");
    fgets(str, sizeof(str), stdin);
    displayString(str); // Truyền chuỗi vào một hàm.
    return 0;
}

void displayString(char str[])
{
    printf("Chuỗi đầu ra: ");
    puts(str);
}

Chuỗi và con trỏ

Tương tự như mảng, tên chuỗi trong C cũng được biểu diễn dưới dạng con trỏ. Do đó, bạn có thể sử dụng con trỏ để thực hiện các thao tác trên từng ký tự của chuỗi.

Tôi khuyên bạn nên đọc lại phần mảng và con trỏ trong lập trình C trước khi xem ví dụ dưới đây.

Ví dụ 4: Chuỗi và con trỏ

#include 

int main(void)
{
    char name[] = "Harry Potter";
    printf("%c", *name); // Đầu ra: H
    printf("%c", *(name + 1)); // Đầu ra: a
    printf("%c", *(name + 7)); // Đầu ra: o

    char *namePtr;
    namePtr = name;
    printf("%c", *namePtr); // Đầu ra: H
    printf("%c", *(namePtr + 1)); // Đầu ra: a
    printf("%c", *(namePtr + 7)); // Đầu ra: o
}

Các hàm xử lý chuỗi thông thường được sử dụng:

  • strlen() - tính độ dài của một chuỗi
  • strcpy() - sao chép từ một chuỗi sang một chuỗi khác
  • strcmp() - so sánh hai chuỗi
  • strcat() - nối hai chuỗi

Hàm xử lý chuỗi trong C

Trong phần này, chúng ta sẽ tìm hiểu cách thao tác trên chuỗi trong lập trình C bằng cách sử dụng các hàm thư viện tiêu chuẩn như gets(), puts(), strlen(),...

Bên cạnh đó, bạn cũng sẽ học cách lấy chuỗi mà người dùng nhập vào và thực hiện các thao tác trên chuỗi.

Bạn sẽ thường xuyên thao tác trên chuỗi tuỳ theo vấn đề cụ thể mà bạn cần giải quyết.

Tuy nhiên, không phải tất cả các thao tác trên chuỗi cần phải thực hiện theo cách thủ công, vì điều này sẽ làm cho mã nguồn của bạn trở nên phức tạp và khó hiểu.

Để giải quyết vấn đề này, lập trình C đã cung cấp một số lượng lớn các hàm xử lý chuỗi trong thư viện tiêu chuẩn "string.h".

Dưới đây là một số hàm xử lý chuỗi thông thường được sử dụng:

  • Hàm strlen(): tính độ dài của một chuỗi
  • Hàm strcpy(): sao chép một chuỗi sang một chuỗi khác
  • Hàm strcmp(): so sánh hai chuỗi
  • Hàm strcat(): nối hai chuỗi
  • Hàm strlwr(): chuyển đổi chuỗi sang chữ thường
  • Hàm strupr(): chuyển đổi chuỗi sang chữ in hoa

Các hàm xử lý chuỗi này được định nghĩa trong tệp tiêu đề "string.h". Để sử dụng các hàm này, bạn cần thêm đoạn mã sau vào chương trình của mình:

#include 

Lưu ý: Bạn phải bao gồm tệp tiêu đề "string.h" để sử dụng các hàm xử lý chuỗi.

Đây là những điều cơ bản về chuỗi trong ngôn ngữ lập trình C và cách nhập xuất chuỗi trong C. Hi vọng bài viết này đã giúp bạn hiểu rõ hơn về chủ đề này và áp dụng vào công việc lập trình của mình.

1