2012-02-03 8 views
5

Vì vậy, tôi có một tình huống khó xử. Tôi cần phải so sánh hai chuỗi kiểu C và tôi đã tìm kiếm các chức năng thích hợp nhất:Chức năng thích hợp để so sánh hai chuỗi kiểu C là gì?

memcmp //Compare two blocks of memory (function) 
strcmp //Compare two strings (function) 
strcoll //Compare two strings using locale (function) 
strncmp //Compare characters of two strings (function) 
strxfrm //Transform string using locale (function) 

Điều đầu tiên tôi nghĩ là địa chỉ, vì vậy ý ​​tưởng được đưa ra. Điều thứ hai có vẻ như là lựa chọn tốt nhất đối với tôi, nhưng tôi vẫn muốn nghe phản hồi. Ba người còn lại để tôi thất bại.

+0

* "Cái đầu tiên tôi nghĩ là dành cho địa chỉ" * - Không, nó dành cho các khối bộ nhớ tùy ý. Cuối cùng, tất cả các chức năng này đều lấy các địa chỉ trỏ đến các khối bộ nhớ để so sánh. Nhưng không ai thực sự so sánh địa chỉ. Nhưng từ các bình luận trong mã của bạn, tôi đoán bạn nhận thức được điều này và chỉ thể hiện bản thân một chút không chính xác. –

Trả lời

19

Để so sánh chuỗi chung, strcmp là hàm thích hợp. Bạn nên sử dụng strncmp để chỉ so sánh một số ký tự từ một chuỗi (ví dụ: tiền tố) và memcmp để so sánh các khối bộ nhớ.

Điều đó nói rằng, vì bạn đang sử dụng C++, bạn nên tránh điều này hoàn toàn và sử dụng lớp std::string, dễ sử dụng hơn và thường an toàn hơn so với chuỗi kiểu C. Bạn có thể so sánh hai số điện thoại std::string s một cách dễ dàng bằng cách chỉ sử dụng toán tử ==.

Hy vọng điều này sẽ hữu ích!

+0

Cảm ơn, tôi rất muốn, nhưng hiện tại giáo sư của chúng tôi đang hạn chế chúng tôi chỉ sử dụng C Strings. – Yokhen

+0

Kiểm tra mã chức năng C cộng và đọc nó ... có thể bạn sẽ tìm thấy một bất ngờ., Và @templatetypedef tôi nghĩ rằng == không phải là toán tử nghi thức trong trường hợp này là imho. – crsuarezf

+0

@ ingcarlos- Bạn đúng là bạn không nên sử dụng == tại đây. Đề xuất của tôi là chuyển sang chuỗi std :: của C++, trong trường hợp toán tử == là cách để đi. – templatetypedef

3

Cả memcmpstrcmp sẽ hoạt động tốt. Để sử dụng trước đây, bạn cần biết trước độ dài của chuỗi ngắn hơn.

+2

Nếu bạn gọi 'memcmp' với độ dài của chuỗi cũ, thì nó sẽ cho bạn biết rằng' "abc" 'và' "abcdef" 'là bằng nhau. Bạn có thể vượt qua nó chiều dài của chuỗi ngắn hơn cộng một (và nó sẽ thấy và so sánh terminator ''\ 0'') - nhưng vì' strcmp' được thiết kế đặc biệt để so sánh chuỗi, đó là những gì bạn nên sử dụng. –

+0

Tôi đồng ý với tất cả điều đó, yup. –

+0

Bất cứ ai cũng biết nếu 'memcmp' có thể nhanh hơn, giả sử do biết độ dài trước và do đó cho phép tối ưu hóa một số bằng cách xem các đoạn dài từ trong ví dụ đầu tiên? – Keith