Apr 5, 2013

Hàm strtok và những rắc rối xung quanh


Thật bất ngờ và tình cờ vì phải đụng đến em này lúc train thi Thách Thức. Và cũng tò mò là vì sao em này có cách dùng lạ đến vậy. Nhưng trước tiên là một số thông tin hấp dẫn đã.

Cú pháp:


char* strtok ( char *str, const char *delimters); 
 
 

Công dụng: Tách chuỗi str thành các chuỗi con. Các kí tự ngăn cách được định nghĩa trong chuỗi delimters.

Tham số:

  • str: chuỗi cần tách.
  • delimters: chuỗi chứ các kí tự ngăn cách

Các sử dụng: để lấy từ phẩn từ sau khi được cắt bị kí tự phân chia. Ta sử dụng đoạn code sau:

pch = strtok (str," ,.-");
while (pch != NULL)
{
  // Phần tử lấy ra là pch pch
  // Xử lý các thao tác trên pch
 pch = strtok (NULL, " ,.-");
}
return 0;

Nhiều người sẽ thắc mắc: đoạn mã strtok(NULL, " ,.-") nghĩa là gì. Nguyên nhân là trong hàm strtok sẽ tạo 1 biến static là char* - ta tạm gọi là last. Ban đầu nó sẽ được gắn bằng NULL. Sau lần duyệt đầu tiên, last sẽ có giá trị là địa chỉ hiện thời của phần tử đã lấy được. Khi chạy đến hàm strtok thứ 2 nó kiểm tra tham số đầu vào có phải là NULL không. Nếu phải thì nó lấy địa chỉ của chuỗi đem cắt gắn bằng giá trị mà last đang giữ.

Tham khảo:

  1. Source code hàm strtok của Microsoft
  2. Source code hàm strtok của Apple.

Lưu ý: vì hàm này tạo 1 biến static tạm để giữ giá trị vừa cắt nên không dùng được cho xử lý đa nhiệm.