1. Hàm strtok()
Hàm strtok() trong thư viện string.h giúp tách các từ trong xâu ra theo 1 ký tự hoặc nhiều ký tự phân cách
Cú pháp :
char * strtok ( char * str, char * delimiters );
Tham số :
- *str : Xâu ký tự cần tách từ
- *delimiters : Một hoặc nhiều ký tự dùng làm ký tự phân cách giữa các từ
Giá trị trả về : Con trỏ tới từ (hay gọi là token) tách được
Trong lần gọi đầu tiên strtok() nhận vào tham số thứ nhất chuỗi cần tách, từ lần gọi thứ 2 trở đi thì strtok nhận vào tham số thứ nhất là con trỏ NULL
Khi tách được từ thì hàm này sẽ trả về cho bạn con trỏ tới từ mà nó tách được, nếu không còn từ nào có thể tách thì hàm này trả về con trỏ NULL
Lưu ý là hàm strtok() sẽ thay đổi xâu ký tự đầu vào chỉ còn là từ đầu tiên của nó.
Ví dụ 1 : Tách từ theo dấu cách
#include "stdio.h" #include "string.h" int main(){ char s[] = "28tech c programming blog python "; char *token = strtok(s, " "); // lần gọi đầu tiên int dem = 0; while(token != NULL){ ++dem; printf("Tu thu %d : %s\n", dem, token); //Các lần tách tiếp theo token = strtok(NULL, " "); } printf("Xau ky tu ban dau : %s\n", s); return 0; }
Output :
Tu thu 1 : 28tech Tu thu 2 : c Tu thu 3 : programming Tu thu 4 : blog Tu thu 5 : python Xau ky tu ban dau : 28tech
Ví dụ 2 : Tách từ theo dấu gạch giữa
#include "stdio.h" #include "string.h" int main(){ char s[] = "28tech-c-programming---blog---python--"; char *token = strtok(s, "-"); // lần gọi đầu tiên int dem = 0; while(token != NULL){ ++dem; printf("Tu thu %d : %s\n", dem, token); //Các lần tách tiếp theo token = strtok(NULL, "-"); } printf("Xau ky tu ban dau : %s\n", s); return 0; }
Output :
Tu thu 1 : 28tech Tu thu 2 : c Tu thu 3 : programming Tu thu 4 : blog Tu thu 5 : python Xau ky tu ban dau : 28tech
2. Tách từ theo nhiều ký tự
Hàm strtok() có thể sử dụng để tách các từ theo 1 loạt các ký tự
Ví dụ 1 : tách các từ theo dấu '.', ',', '!', '?' và dấu cách
#include "stdio.h" #include "string.h" int main(){ char s[] = "28tech.c programming?dsa??blog!python,learn"; char *token = strtok(s, ".,!? "); // lần gọi đầu tiên int dem = 0; while(token != NULL){ ++dem; printf("Tu thu %d : %s\n", dem, token); //Các lần tách tiếp theo token = strtok(NULL, ".,!? "); } printf("Xau ky tu ban dau : %s\n", s); return 0; }
Output :
Tu thu 1 : 28tech Tu thu 2 : c Tu thu 3 : programming Tu thu 4 : dsa Tu thu 5 : blog Tu thu 6 : python Tu thu 7 : learn Xau ky tu ban dau : 28tech
Ví dụ 2 : Tách các từ trong xâu ký tự theo chữ số
Cho một xâu lần các ký tự chữ cái và số, hãy tách các từ trong xâu và bỏ qua các chữ số
#include "stdio.h" #include "string.h" int main(){ char s[] = "28tech123hoc99lap812trinh70voi129tech"; char *token = strtok(s, "0123456789"); // lần gọi đầu tiên int dem = 0; while(token != NULL){ ++dem; printf("Tu thu %d : %s\n", dem, token); //Các lần tách tiếp theo token = strtok(NULL, "0123456789"); } return 0; }
Output :
Tu thu 1 : tech Tu thu 2 : hoc Tu thu 3 : lap Tu thu 4 : trinh Tu thu 5 : voi Tu thu 6 : tech
3. Lưu trữ các từ trong xâu
Đối với các bài toán liên quan tới từ, đôi khi bạn cần lưu lại danh sách các từ để sắp xếp, chuẩn hóa, liệt kê...
strtok() giúp bạn tách các từ nhưng bạn cần sử dụng một mảng để lưu lại các từ này.
Vì mỗi từ đã là một mảng 1 chiều char rồi nên để lưu lại danh sách các từ thì ta dùng mảng 2 chiều kiểu char
Mỗi dòng trong mảng 2 chiều sẽ lưu lại 1 từ, ví dụ mảng char[100][50] sẽ lưu được tối đa 100 từ, mỗi từ dài tối đa 50 kí tự.
Ví dụ 1:
#include "stdio.h" #include "string.h" int main(){ char s[] = "28tech c programming blog python "; char *token = strtok(s, " "); // lần gọi đầu tiên int n = 0; // lưu số từ char a[100][50]; while(token != NULL){ //copy token vào dòng thú n trong mảng a strcpy(a[n], token); ++n; token = strtok(NULL, " "); } printf("So tu trong xau : %d\n", n); for(int i = 0; i < n; i++){ printf("a[%d] = %s\n", i, a[i]); } return 0; }
Output :
So tu trong xau : 5 a[0] = 28tech a[1] = c a[2] = programming a[3] = blog a[4] = python
Ví dụ 2 : Sắp xếp các từ trong xâu theo thứ tự từ điển tăng dần
#include "stdio.h" #include "string.h" void selectionSort(char a[][50], int n){ for(int i = 0; i < n; i++){ int min_idx = i; for(int j = i + 1; j < n; j++){ if(strcmp(a[j], a[min_idx]) < 0){ min_idx = j; } } char tmp[100]; strcpy(tmp, a[i]); strcpy(a[i], a[min_idx]); strcpy(a[min_idx], tmp); } } int main(){ char s[] = " zzz 28tech c programming blog python aab"; char *token = strtok(s, " "); // lần gọi đầu tiên int n = 0; // lưu số từ char a[100][50]; while(token != NULL){ //copy token vào dòng thú n trong mảng a strcpy(a[n], token); ++n; token = strtok(NULL, " "); } selectionSort(a, n); printf("So tu trong xau : %d\n", n); printf("Cac tu sau khi sap xep :\n"); for(int i = 0; i < n; i++){ printf("%s ", a[i]); } return 0; }
Output :
So tu trong xau : 7 Cac tu sau khi sap xep : 28tech aab blog c programming python zzz
Video hàm strtok() :