Cách khai báo chuỗi trong C và các kiến thức liên quan | Ironhack

Chuỗi trong lập trình C

Trong phần này, bạn sẽ được tìm hiểu các kiến thức liên quan đến string hay chuỗi trong C: 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ụ.

Trong lập trình C, chuỗi là một chuỗi các ký tự được kết thúc bằng ký tự rỗng \0. Ví dụ:

char c[] = “c string”;

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

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

Dưới đây là cách khai báo chuỗi ký tự trong C:

char s[5];

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 những 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’};

Hãy xem qua 1 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ảng char – mảng này chỉ có 5 ký tự. Tuy nhiên, mọi thứ đều diễn ra khá tệ và bạn không nên làm những việc tương tự như thế.

Gán giá trị cho chuỗi

Mảng ký tự trong C và chuỗi ký tự là 2 phần tử đồng hạng hai trong lập trình C. Chúng không hỗ trợ toán tử gán khi nó được khai báo. Ví dụ,

char c[100];

c = “C programming”; // Error! array type is not assignable.

Lưu ý, bạn có thể sử dụng hàm strcpy() để sao chép chuỗi trên.

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

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

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

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

#include <stdio.h>

int main()

{

char name[20];

printf(“Enter name: “);

scanf(“%s”, name);

printf(“Your name is %s.”, name);

return 0;

}
Đầu ra
Enter name: Dennis Ritchie
Your name is Dennis.
Mặc dù tôi đã nhập Dennis Ritchie vào lập trình trên nhưng chỉ có “Dennis” là được lưu trữ trong chuỗi name. Bởi vì có một khoảng trống phía sau 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 1 dòng trong chuỗi. Và sử dụng hàm puts() để hiển thị chuỗi.

Ví dụ 2: Hàm fgets() và put()

#include <stdio.h>

int main()

{

char name[30];

printf(“Enter name: “);

fgets(name, sizeof(name), stdin); // read string

printf(“Name: “);

puts(name); // display string

return 0;

}

Đầu ra
Enter name: Tom Hanks
Name: Tom Hanks

Dưới đây, tôi sử dụng hàm fgets() để đọc một chuỗi do người dùng nhập vào.
fgets(name, sizeof(name), stdlin); // read string

Kết quả sizeof(name) là 30. Do đó, tôi có thể lấy tối đa 30 ký tự làm đầu vào và cũng chính là kích thước của chuỗi name.

Để in 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 do người dùng nhập. Tuy nhiên, nó không phải là hàm tiêu chuẩn trong lập trình C.

Bởi vì hàm gets() cho phép bạn nhập chuỗi trong C độ dài ký tự tùy ý. Điều này sẽ dẫn đến tình trạng tràn bộ nhớ đệm.

Truyền chuỗi vào hàm nhập chuỗi trong C

String trong C có thể được truyền vào hàm theo cách tương tự như mảng. Xem chi tiết 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 <stdio.h>

void displayString(char str[]);

int main()

{

char str[50];

printf(“Enter string: “);

fgets(str, sizeof(str), stdin);

displayString(str); // Passing string to a function.

return 0;

}

void displayString(char str[])

{

printf(“String Output: “);

puts(str);

}

Chuỗi và biến pointer

Tương tự như mảng, tên chuỗi cũng được phân rã thành biến pointer. Do đó, bạn có thể sử dụng biến pointer để thực hiện thao tác trên các phần tử của chuỗi.

Tôi nghĩ là bạn nên xem lại phần mảng và biến pointer trong lập trình C trước khi xem ví dụ dưới đây.

Ví dụ 4: Chuỗi và biến pointer

#include <stdio.h>

int main(void) {

char name[] = “Harry Potter”;

printf(“%c”, *name); // Output: H

printf(“%c”, *(name+1)); // Output: a

printf(“%c”, *(name+7)); // Output: o

char *namePtr;

namePtr = name;

printf(“%c”, *namePtr); // Output: H

printf(“%c”, *(namePtr+1)); // Output: a

printf(“%c”, *(namePtr+7)); // Output: o

}

Các hàm xử lý chuỗi 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 chuỗi khác
  • strcmp() – so sánh 2 chuỗi
  • strcat() – nối 2 chuỗi

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

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.

Trong phần này, bạn sẽ được học về 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 tiêu chuẩn như gets(), puts, strlen(),…

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

Bạn phải thường xuyên thao tác trên các chuỗi, tùy thuộc vào vấ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 đều được thực hiện một cách thủ công, bởi vì điều này khiến cho lập trình của bạn trở nên phức tạp và “cồng kềnh”.

Để giải quyết vấn đề này, lập trình C đã hỗ trợ một 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 được sử dụng

Hàm
Chức năng của hàm

strlen()
tính độ dài của chuỗi

strcpy()
sao chép một chuỗi sang chuỗi khác

strcat()
nối 2 chuỗi

strcmp()
so sánh 2 chuỗi

strlwr()
chuyển đổi chuỗi sang chữ thường

strupr()
chuyển đổi chuỗi sang chữ in hoa

Các hàm xử lý chuỗi được xác định trong tệp tiêu đề “string.h”.

#include <string.h>

Lưu ý: Bạn phải thêm cả đoạn mã bên dưới để chạy các hàm xử lý chuỗi.

Hàm gets() và puts()

gets() và puts() là 2 hàm xử lý chuỗi dùng để lấy đầu vào của chuỗi do người dùng nhập và hiển thị nó một cách riêng lẻ. Bạn có thể xem lại phần Chuỗi trong lập trình C để biết thêm thông tin chi tiết.

#include <stdio.h>

int main()

{

char name[30];

printf(“Enter name: “);

gets(name); //Function to read string from user.

printf(“Name: “);

puts(name); //Function to display string.

return 0;

}

Lưu ý, mặc dù hàm gets() và puts() xử lý các chuỗi trong C nhưng cả hai hàm này đều được xác định trong tệp tiêu đề “stdio.h”.