Một số vấn đề thường gặp về chuỗi trong lập trình C

15:18 22/11/2023

Trong ngôn ngữ lập trình C, chuỗi là một tập hợp các ký tự (char) được lưu trữ trên các ô nhớ liên tiếp và luôn luôn có 1 ký tự null là \0 báo hiệu kết thúc chuỗi. Vì vậy, trong bài viết này, chúng ta sẽ được tìm hiểu về cách khai báo, khởi tạo và sử dụng chúng cho các hoạt động vào/ra thông qua các ví dụ.

Ví dụ một chuỗi trong ngôn ngữ lập trình C: int c[] = “c string”;

Khi khai báo và khởi tạo chuỗi theo cách trên, trình biên dịch sẽ tự thêm 1 ký tự null \0 vào cuối.

Chuỗi trong lập trình C

Như vậy, nếu chúng ta muốn khai báo chuỗi để lưu n ký tự, chúng ta cần mảng ký tự có kích thước tối đa ít nhất là n+1.

Cách khởi tạo giá trị cho chuỗi

Chúng ta có thể khởi tạo giá trị cho chuỗi theo 1 trong các cách dưới đây:

char c[] = “abcd”;

char c[50] = “abcd”;

char c[] = {‘a’, ‘b’, ‘c’, ‘d’, ‘\0’};

char c[5] = {‘a’, ‘b’, ‘c’, ‘d’, ‘\0’};

Nhưng không thể làm như sau:

char c[5] = “abcde”;

Bởi vì chuỗi của của chúng ta có 5 ký tự cộng thêm 1 ký tự \0 là 6, sẽ bị vượt quá kích thước tối đa.

Cách nhập xuất chuỗi trong C

Chúng ta có thể sử dụng hàm scanf() để nhập chuỗi không có chứa dấu trắng (dấu cách, dấu tab, dấu \n)  và hàm printf() để xuất chuỗi.

#include <stdio.h>

int main(int argc, char *argv[])

{

    char ten[20];

    printf(“Nhập tên: “);

    scanf(“%s”, ten);

    printf(“Tên của bạn là %s.”, ten);

    return 0;

}

Kết quả chạy:

Nhập tên: Dũng Nguyễn Tuấn

Tên của bạn là Dũng.

Nếu chúng ta để ý thì hàm scanf() dùng dấu trắng để nhập nhiều input đồng thời. Do đó chúng ta chỉ nên dùng hàm `scanf()` khi nhập chuỗi viết liền.

Cách nhập chuỗi có khoảng trắng

Để nhập chuỗi bao gồm cả dấu trắng, chúng ta nên sử dụng hàm fgets() để nhập. Tương ứng, chúng ta cũng có thể in ra chuỗi bằng hàm puts().

#include <stdio.h>

int main(int argc, char *argv[])

{

    char ten[30];

    printf(“Nhập tên: “);

    fgets(ten, sizeof(ten), stdin);  // Đọc chuỗi

    // gets(ten); // không nên dùng

    printf(“Tên: “);

    puts(ten);    // Hiển thị tên

    return 0;

}

Kết quả chạy:

Nhập tên: Nguyễn Tuấn Dũng

Tên của bạn là Nguyễn Tuấn Dũng

Lưu ý:

  • Chúng ta hoàn toàn có thể dùng hàm printf() để xuất chuỗi có khoảng trắng. Sự khác biệt là hàm puts() sẽ in thêm 1 dấu \n ở cuối chuỗi.
  • Hàm gets() cũng có thể dùng để nhập chuỗi theo cách ở dòng 7 (đã comment lại) trong đoạn code trên. Tuy nhiên hàm này không còn được khuyến khích được sử dụng vì nó không chỉ định kích thước tối đa của chuỗi => Có thể gây ra tràn bộ nhớ làm lỗi chương trình.

Chương trình không cho nhập chuỗi?

Nếu chúng ta làm việc với chuỗi mà xảy ra hiện tượng chương trình bỏ qua bước nhập chuỗi của chúng ta thì đây là vấn đề. Hiện tượng này xảy ra do trước khi nhập chuỗi chúng ta có nhập vào 1 biến số nào đó. Điều đó khiến bộ nhớ đệm còn lưu lại ký tự \n.

#include <stdio.h>

int main(int argc, char *argv[])

{

    int tuoi;

    char ten[30];

    printf(“Nhập tuổi: “);

    scanf(“%d”, &tuoi);

    printf(“Nhập tên: “);

    gets(ten);

    printf(“%s – %d”, ten, tuoi);

    return 0;

}

Kết quả chạy:

Nhập tuổi: 23

Nhập tên: – 23

Để khắc phục vấn đề này, chúng cần dùng hàm fflush(stdin) để xóa bộ nhớ đệm khi dùng gets() và dùng getchar() ở giữa các lần sử dụng scanf() kết hợp với fgets(). 

// Nếu dùng fgets()

#include <stdio.h>

int main(int argc, char *argv[])

{

    int tuoi;

    char ten[30];

    printf(“Nhập tuổi: “);

    scanf(“%d”, &tuoi);

    getchar(); // đọc ký tự ‘\n’

    printf(“Nhập tên: “);

    fgets(ten, sizeof ten, stdin);

    printf(“%s – %d”, ten, tuoi);

}

Kết quả chạy:

  • Nhập tuổi: 23
  • Nhập tên: Nguyễn Công Dũng
  • Nguyễn Công Dũng

– 23

// Nếu dùng gets()

#include <stdio.h>

int main(int argc, char *argv[])

{

    int tuoi;

    char ten[30];

    printf(“Nhập tuổi: “);

    scanf(“%d”, &tuoi);

    fflush(stdin); // đọc ký tự ‘\n’

    printf(“Nhập tên: “);

    gets(ten);

    printf(“%s – %d”, ten, tuoi);

}

Kết quả chạy:

Nhập tuổi: 23

Nhập tên: Nguyễn Công Dũng

Nguyễn Công Dũng – 23

Như vậy, chúng ta đã tìm hiểu về cách khai báo và nhập chuỗi trong ngôn ngữ lập trình C. Hy vọng bài viết này sẽ hữu ích với bạn. Chúc các bạn thành công!

Giảng viên Nguyễn Thị Hồng Hà
Bộ môn Ứng dụng phần mềm
Trường Cao đẳng FPT Mạng cá cược bóng đá cơ sở Hà Nội

Cùng chuyên mục

Đăng Kí học Fpoly 2023