2012-02-20 32 views
5

Tôi có bộ đệm (ví dụ: char buffer[1024]) được điền một số dữ liệu. Bây giờ tôi muốn tìm kiếm một chuỗi con trong bộ đệm này. Vì nó nên là một trường hợp tìm kiếm insenstive tôi đang sử dụng boost::algorithm::ifind_first.Boost find_first cách hoạt động?/Xác định dải ô

Vì vậy, tôi gọi hàm như thế này:

boost::iterator_range<char*> buf_iterator; 
buf_iterator = boost::algorithm::ifind_first(buffer ,"substring"); 

Điều này thực sự hoạt động tốt. Nhưng mối quan tâm của tôi là:

Tôi chuyển chức năng chỉ char pointer, vì vậy ifind_first không nên biết nơi bộ đệm của tôi kết thúc, nhưng nó vẫn hoạt động tho.

Bây giờ ý tưởng đầu tiên của tôi là chức năng tìm kiếm cho đến khi ký tự kết thúc chuỗi. Nhưng trong Boost Documentation hàm được định nghĩa như thế này:

template<typename Range1T, typename Range2T> 
    iterator_range< typename range_iterator<Range1T>::type > 
    find_first(Range1T & Input, const Range2T & Search); 

Kể từ khi nó hoạt động với các thông số mẫu tôi thực sự nghi ngờ rằng nó đang làm việc với chấm dứt null?

Vì vậy, câu hỏi của tôi là cách ifind_first biết dừng ở đâu? Hoặc chính xác hơn, làm thế nào tôi có thể cung cấp cho nó một phạm vi? Như đã đề cập nó hoạt động tốt với một char* nhưng tôi không hoàn toàn chắc chắn nếu tôi không chỉ may mắn - tôi có nghĩa là trong trường hợp xấu nhất chức năng được gọi và không biết nơi để dừng lại và đi vào bộ nhớ không xác định .. .

Edit:

Bây giờ trong một câu trả lời có được đề cập rằng nó phụ thuộc vào loại tôi vượt qua để hàm. Bây giờ điều này có nghĩa là nếu tôi làm việc với bộ đệm char, tôi phải luôn đảm bảo rằng nó đã bị chấm dứt 0 ...?

+0

Nếu tài liệu nêu rõ phương pháp được ẩn rất tốt! – CapelliC

+0

Vui lòng không ký bài đăng của bạn. –

Trả lời

5

Nó sử dụng một kỹ thuật mà chiều dài của một mảng là một đối số mẫu, ví dụ:

template< typename T, size_t L > 
void foo(T (&arr)[L]) 
{ 
} 

Là một chuỗi chữ đã biết chiều dài L có thể suy ra, chẳng hạn như foo ("test") là foo < char, 5>(). Tôi đặt cược có một tình trạng quá tải cho const char * trong đó giả định rằng đối số là một chuỗi c, trong đó strlen() có thể được sử dụng để xác định độ dài.

EDIT: giải thích trình diễn tốt hơn như thế nào ifind_first sẽ thất bại, và tại sao nó sẽ không nếu bạn cẩn thận

gì quyết định liệu ifind_first sẽ thất bại hay không trong trường hợp này là liệu một trong hai chủ đề hoặc tìm kiếm degenerates vào một char *. Trong trường hợp này, bạn đã truyền một chuỗi chữ như tìm kiếm trực tiếp, ifind_first sẽ thử và đoán sẽ kết luận rằng đó là const char [10] (chiều dài của "chuỗi con" + 1 cho NULL terminator). Tuy nhiên, để tìm kiếm nó không quan trọng, bởi vì ngay cả khi nó thoái hóa thành const char * ifind_first sẽ đoán rằng đó là một NULL chấm dứt chuỗi c, và một chuỗi chữ là NULL chấm dứt chuỗi c một công việc cho dandy dandy.

Trong trường hợp này, bạn thực sự yêu cầu bộ đệm char [1024], trong trường hợp của bạn, nó không bị thoái hóa thành char *. Nhưng nếu thay vào đó bạn đã có thể cho phép nói char * buffer = new char [1024]; loại bộ đệm là char * và nó không đảm bảo được NULL chấm dứt. Trong trường hợp này ifind_first sẽ thất bại theo những cách bí ẩn tùy thuộc vào những gì sau khi khu vực bạn đã điền.Vì vậy, để kết luận, vì loại bộ đệm là char [1024] trong trường hợp của bạn nó sẽ không chạm vào bộ nhớ qua cuối bộ đệm, NHƯNG, nó cũng sẽ không quan tâm về việc liệu có một terminator NULL trong đó (nó hay không?). không tìm kiếm nó, như bạn đã vượt qua nó một char [1024] nó biết chiều dài tại thời gian biên dịch). Vì vậy, nếu cho phép nói rằng bạn điền vào bộ đệm với 12 ký tự theo sau bởi NULL nó vẫn sẽ tìm kiếm toàn bộ bộ đệm.

+0

Điều này không giải thích lý do tại sao nó có vẻ như đang làm việc với một bộ đệm 'char' không bị null, trong đó' strlen() 'sẽ không giúp ích gì. – nabulke

+0

Vì vậy, có nghĩa là ví dụ: Nếu tôi có một bộ đệm với 1024 Byte tôi nên khởi tạo bộ đệm của tôi với 'char buffer [1025] = {0}' vì vậy tôi chắc chắn rằng nó là ** luôn luôn ** null chấm dứt (ngay cả khi tôi nhận được chính xác 1024 byte) ...? – Toby

+0

@nabulke: Không, bộ đệm char [1024] là kích thước cố định, nó không phải char * (mặc dù nó có thể biến thành char * nếu bạn không cẩn thận). Hãy thử buf_iterator = boost :: algorithm :: ifind_first ((char *) buffer, "substring"); – Ylisar

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