0965303260
TP. Hồ Chí Minh

[C]. Hàm strtok()

Để tách các từ trong 1 xâu ký tự thì ngôn ngữ lập trình C cung cấp cho các bạn một hàm rất mạnh đó là strtok(), bài học này mình sẽ hướng dẫn các bạn sử dụng hàm này thông qua một vài ví dụ

NỘI DUNG : 

  • Hàm strtok()
  • Tách từ theo nhiều ký tự
  • Lưu trữ các từ trong xâu
  • Video tutorial

strtok

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() : 

swg3DIXOjs0