Blogger Widgets

Thứ Hai, 9 tháng 12, 2013

ĐIỀU THÚ VỊ VỀ HÀM STRTOK

         Bạn nào học trường đại học Khoa học tự nhiên,  khoa Công nghệ thông tin, chắc chắn đều đã đọc cuốn sách "Nhập môn lập trình" do chính các thầy trong trường viết. Hôm nay, tình cờ mình phát hiện được một điều cũng khá thú vị và muốn chia sẻ với các bạn.

         Trong chương "Chuỗi kí tự" ở trang 219, có một đoạn code như thế này:

{ char *s="They are dogs, cats. The dogs..."; char *sep=" ,.";
  char *word=strtok(s,sep);
  while (word!=NULL) {
     printf("%s\n",word);
     word=strtok(NULL,sep);
   }
}
         Lúc đầu, mình chạy thử đoạn code này hoài, nhưng máy vẫn báo lỗi. Hoảng lắm, tưởng mình chép trong sách mà còn chép sai nữa thì mất tự tin quá. Rồi một hồi chạy mãi không được, mình thử xem lại đoạn code thì mới biết chỉ cần thay "*s" bằng "s[]" là xong.

        Mình đi xem trên các trang web dạy C thì mới biết, hàm "strtok" sẽ làm thay đổi nội dung của chuỗi truyền vào nó, nên nếu ta dùng "*s" rồi khởi tạo thì lúc này "s" sẽ là một con trỏ hằng => không thể thay đổi => máy sẽ báo lỗi. ^^!

        À! Chắc một số bạn cũng thắc mắc ý nghĩa dòng lệnh "word=strtok(NULL,sep)" này phải không? Mình sẽ giải thích cơ chế của hàm "strtok" và bạn sẻ hiểu ngay.

        Hàm "strtok" khi được gọi, sẽ tạo ra một biến con trỏ trong bộ nhớ, biến này lúc đầu có giá trị là NULL. Sau lần gọi thứ nhất, biến này sẽ được gán bằng địa chỉ của chuỗi còn lại. Đến lần gọi thứ hai, hàm sẽ xem đối số vào có phải là NULL không. Nếu phải, nó sẽ lấy địa chỉ lưu trong biến tạm trên, nhận làm đối số. Như vậy sẽ giúp ta cắt tiếp đoạn chuỗi còn lại.

        Một số chỗ mình giải thích chưa ổn cũng như câu từ chưa khoa học lắm, mong mọi người thông cảm. Rất mong nhận được sự góp ý của các bạn.

1 nhận xét :

  1. Sau khi thoát khỏi hàm thì biến tạm sẽ bị xóa, mình không biết lần gọi thứ 2 nó so sánh kiểu gì.

    Trả lờiXóa

Copyright © 2011 Template Doctor . Designed by Malith Madushanka - Cool Blogger Tutorials | Code by CBT | Images by by HQ Wallpapers