Một số vấn đề cần nhớ về chuỗi trong C

  • Cách khai báo và sử dụng chuỗi trong C
  • Sử dụng các hàm chuỗi của thư viện string.h: strlen, strcpy, strcat, strcmp, strchr, strstr, ...
  • Cách kết hợp chuỗi với con trỏ.
  • Sử dụng fgets để nhập chuỗi từ bàn phím.
  • Xử lý vấn đề giới hạn kích thước của chuỗi trong C.

1. Cách khai báo:

Chuỗi trong C là một dãy các ký tự liên tiếp được lưu trữ trong bộ nhớ và kết thúc bằng ký tự null '\0'. Trong C, chúng ta không thể truy xuất hoặc sửa đổi một ký tự trong một chuỗi, nên chúng ta phải tạo một chuỗi mới hoặc sửa đổi toàn bộ chuỗi. Ví dụ:

#include <stdio.h>
int main()
{
    char str[100] = "Hello World";
    printf("%s\n", str);
    return 0;
}

Kết quả: "Hello World" 

2. Khởi tạo chuỗi

  • Sử dụng một chuỗi ký tự:
    • char str1[] = "Hello, World!";
  • Sử dụng một mảng ký tự:
    • char str2[] = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\0'};
  • Sử dụng kết hợp chuỗi ký tự và mảng ký tự:
    • char str3[20] = "Hello, World!";
  • Sử dụng một con trỏ tới một chuỗi ký tự:
    • char *str4 = "Hello, World!";

3. Hàm fgets()

fgets là một hàm trong C để đọc một chuỗi từ một file hoặc từ stdin (standard input, nhập từ bàn phím). Ví dụ:

#include <stdio.h>
#define MAX_LEN 100
int main()
{
    char str[MAX_LEN];

    printf("Enter a string: ");
    fgets(str, MAX_LEN, stdin);
    printf("The string you entered is: %s", str);

    return 0;
}
Trong ví dụ trên, hàm fgets sẽ đọc một chuỗi từ stdin và gán nó vào biến str. Số lượng ký tự tối đa để đọc là MAX_LEN, đảm bảo rằng chuỗi đọc được không quá 100 ký tự. Chú ý: stdin (đầu vào tiêu chuẩn) trong C là một luồng tệp được xác định trước tham chiếu đến luồng đầu vào tiêu chuẩn cho một chương trình. Theo mặc định, luồng này được kết nối với bàn phím và được sử dụng để đọc những giá trị từ người dùng nhập vào bàn phím.

Bạn có thể sử dụng các chức năng như scanf hoặc fgets để đọc dữ liệu từ stdin và lưu trữ nó trong các biến.

3. Mối quan hệ giữa chuỗi (string) và con trỏ (pointer) trong C

  • Trong C, chuỗi (string) là một mảng các ký tự liên tiếp với nhau được lưu trữ trong bộ nhớ máy tính. Mỗi chuỗi được kết thúc bằng ký tự null '\0'.
  • Con trỏ (pointer) là biến đặc biệt trong C mà chứa địa chỉ của một biến hoặc một đối tượng trong bộ nhớ máy tính.


Chuỗi và con trỏ có mối quan hệ rất mật thiết trong C. Một chuỗi trong C có thể được xem như một con trỏ đặc biệt trỏ đến phần tử đầu tiên của mảng các ký tự.

Ví dụ: char *str = "Hello, World!";

Trong ví dụ này, 'str' là một con trỏ đến vị trí đầu tiên của mảng các ký tự "Hello, World!"

Ví dụ về việc sử dụng con trỏ kết hợp với chuỗi:
Trong C, chuỗi và con trỏ đôi khi được sử dụng cùng nhau để quản lý và xử lý chuỗi. Một ví dụ cụ thể về việc sử dụng con trỏ kết hợp với chuỗi là việc tạo một chuỗi nhập vào từ người dùng:

#include <stdio.h>

int main() {
      char str[] = "Hello, World!";
      char *ptr = str;
      int i;

      for (i = 0; *ptr != '\0'; i++) {
            printf("%c", *ptr);
            ptr++;
      }
      printf("\n");

      return 0;
}

Trong ví dụ này, một chuỗi str được định nghĩa là một mảng các ký tự và một con trỏ ptr được khởi tạo để trỏ đến ký tự đầu tiên của chuỗi. Sau đó, vòng lặp for sử dụng con trỏ để duyệt qua chuỗi và in từng ký tự của nó.

Sửa đổi một chuỗi bằng cách sử dụng một con trỏ: Một con trỏ có thể được sử dụng để sửa đổi các ký tự của một chuỗi. Ví dụ: 

#include <stdio.h>
int main() {
    char str[] = "Hello, World!";
    char *ptr = str;
    while (*ptr != '\0') {
        *ptr = (*ptr >= 'A' && *ptr <= 'Z') ? (*ptr + 'a' - 'A') : *ptr;
        ptr++;
    }
    printf("The modified string is: %s\n", str);
    return 0;
}

4. Sự khác biệt giữa chuỗi ký tự và mảng ký tự

Trong C, một chuỗi là một chuỗi các ký tự được kết thúc bằng một ký tự null ('\0'). Một chuỗi có thể được biểu diễn dưới dạng một mảng các ký tự hoặc dưới dạng một con trỏ trỏ tới một chuỗi ký tự.

Một mảng ký tự có thể được định nghĩa như sau:

  • char str[] = "Hello, World!";

Một con trỏ tới một chuỗi ký tự có thể được định nghĩa như sau:

  • char *str = "Hello, World!";

Sự khác biệt chính giữa một chuỗi và một mảng ký tự là một chuỗi ở chế độ chỉ đọc (read-only) - nghĩa là ko thể thay đổi nội dung của chuỗi. Trong khi một mảng ký tự có thể được sửa đổi. Khi bạn xác định một chuỗi dưới dạng con trỏ trỏ tới một chuỗi ký tự, bạn không thể sửa đổi chuỗi đó, nhưng khi bạn xác định một chuỗi dưới dạng một mảng ký tự, bạn có thể sửa đổi các phần tử của nó.

Ví dụ: đoạn mã sau không hợp lệ đối với chuỗi được xác định là con trỏ:

char *str = "Hello, World!";
str[0] = 'h';
Tuy nhiên, đoạn mã sau hợp lệ cho một chuỗi được xác định là một mảng ký tự:
char str[] = "Hello, World!";
str[0] = 'h';
Nói chung, tốt nhất là sử dụng các mảng ký tự khi bạn cần sửa đổi một chuỗi và con trỏ tới các ký tự chuỗi ký tự khi bạn cần biểu diễn một chuỗi không đổi.

Nguồn: chatGPT, dùng để tham khảo