2012-11-14 12 views
6

Khi tôi không gọi chức năng tương tự trong mã tất cả mọi thứ của tôi hoạt động tốt nhưng khi trở về chức năng từ một đệ quy đột nhiên biến pch là NULL:c strtok trả về NULL sau khi trở về từ đệ quy

void someFunction() 
    { 
     char * pch; 
     char tempDependencies[100*64+100]; 
     strcpy(tempDependencies,map[j].filesNeeded); 
     pch = strtok(tempDependencies,","); 
     while (pch != NULL) 
     { 
      someFunction(); <- if i comment this out it works fine 
      pch = strtok (NULL, ","); 
     } 
     } 

Vì vậy, đối ví dụ khi vòng lặp hoạt động trên chuỗi file2,file3,file4, nó phân tách chính xác file2 và sửa đổi chuỗi thành file2\\000file3,file4 nhưng lệnh gọi tiếp theo là pch = strtok (NULL, ","); hiển thị pch0x0. Có những thứ mà tôi không biết khi gọi đệ quy không?

Trả lời

11

strtok() không phải là reentrant. Nếu bạn muốn sử dụng nó trong một hàm đệ quy, bạn phải sử dụng strtok_r().

Xem thêm: strtok, strtok_r

5

Bạn không thể gọi strtok chức năng một lần nữa trước khi thực hiện trước đó được thực hiện - Nó không phải là reentrant.

Sử dụng phiên bản reentrant strtok_r thay thế.