2013-06-27 56 views
6

Để lặp qua một chuỗi str tôi đã sử dụng:Sử dụng strtok trong một vòng lặp for

for (tok = strtok(str, ";"); tok && *tok; tok = strtok(NULL, ";")) 
{ 
    //do stuff 
} 

Tôi muốn hiểu làm thế nào vòng lặp này hoạt động. Dường như với tôi:

(1) tok = strtok(str, ";"); //initialization of tok with the first token in str  
(2) tok = strtok(NULL, ";"); // go to the next token in str? how does this work? 
(3) tok && *tok; //this stops the loop when tok =NULL or *tok=NULL 

Tôi rất cảm kích sự giúp đỡ của bạn!

+4

Bạn đúng trên cả ba số :) – dasblinkenlight

+0

Hãy xem xét ** * câu hỏi để biết thêm chi tiết về cách 'strtok()' hoạt động. Đặc biệt http://stackoverflow.com/questions/3889992/please-help-in-strtok?rq=1 – Barmar

+1

Bài kiểm tra '* tok' không phải là một phần của thành ngữ chuẩn strtok. Có vẻ như nó muốn dừng sớm trên một cánh đồng trống, nhưng nó sẽ không hoạt động vì strtok bỏ qua các trường trống. –

Trả lời

-1

nếu bạn đọc manpages cho strtok nó khẳng định

Các strtok() chức năng phân tích một chuỗi thành một chuỗi các thẻ. Trên cuộc gọi đầu tiên tới strtok() chuỗi được phân tích cú pháp phải được chỉ định trong str. Trong mỗi cuộc gọi tiếp theo sẽ phân tích cú pháp cùng một chuỗi, str phải là NULL.

1

(2) tok = strtok (NULL, ";"); // đi đến mã thông báo tiếp theo trong str? Cái này hoạt động ra sao?

Đó chính xác là cách hoạt động của strtok(). Bằng cách gửi NULL làm tham số đầu tiên, bạn báo hiệu rằng strtok() nên tiếp tục với chuỗi được gửi đến nó trong cuộc gọi cuối cùng. Nếu bạn muốn biết chi tiết triển khai chính xác, bạn sẽ cần xem mã nguồn cho strtok(). Nhiều khả năng nó sử dụng biến cục bộ tĩnh.

+1

Cách thức hoạt động của nó thực sự là nó loại bỏ đối số đầu tiên từ cuộc gọi ban đầu trong một biến riêng. –

+0

Thực ra, tôi nên nói rằng con sóc đi đến cuối mã thông báo đầu tiên/bắt đầu của mã thông báo tiếp theo và cập nhật với mỗi cuộc gọi. –

-1

Bạn có thể tìm hiểu thêm về strtok tại đây. Nó có một số ví dụ về cách sử dụng nó.

Trích dẫn từ liên kết, str tham số trong strtok(str, delim):

ý rằng nội dung của chuỗi này được sửa đổi và chia thành các chuỗi nhỏ hơn (thẻ). Alternativelly, một con trỏ null có thể được chỉ định, trong trường hợp đó hàm tiếp tục quét khi một cuộc gọi thành công trước đó đến hàm kết thúc.

3 dự đoán của bạn là chính xác.

+0

Có gì sai với câu trả lời này? – jh314

+0

Tôi không phải là downvoter, nhưng nó chỉ trùng lặp những gì OP đã viết, ngoại trừ "làm thế nào để làm việc này?", Mà nó không trả lời. –

+0

Cảm ơn !, Tôi sẽ chỉnh sửa nó cho phù hợp. – jh314

4

Dưới đây là một việc thực hiện mẫu strtok: http://bxr.su/o/lib/libc/string/strtok.c#strtok

Như bạn thấy trong các mã, nó sử dụng một con trỏ vật tĩnh nội bộ (khá nhiều mỗi phiên bản tôi đã nhìn thấy lưu trữ một con trỏ, hoặc như là một biến toàn cầu hoặc là một biến tĩnh như trong trường hợp trên). Phiên bản này gọi số reentrant strtok_r (và tác dụng phụ của dòng if (s == NULL && (s = *last) == NULL) là sử dụng con trỏ cuối cùng nếu NULL được thông qua)

+0

"khá nhiều mỗi phiên bản tôi đã nhìn thấy" - nó không thể thực hiện nó nếu không. –

Các vấn đề liên quan