2014-07-23 13 views
12
string s; 
s += '\0'; 
s += '\t'; 
if (s == "\0\t") 
    cout << "Yahoo"; 

Tôi không thể nhận được "yahoo".Tại sao một chuỗi chứa ' 0' và ' t' không thể sử dụng toán tử == để so sánh với " 0 t"?

Và điều đó có nghĩa là nếu tôi muốn kiểm tra chuỗi như thế này, tôi phải viết mã như thế này?

if (s[0] == '\0' && s[1] == '\t') 
    cout << "Yahoo"; 
+0

Vì chuỗi ký tự không thể chứa '\ 0'. Đó là thực hiện như là terminator. – EJP

+4

@EJP nó có thể chứa '\ 0', vấn đề là khi sử dụng hàm tạo' std :: string (char const *) '. Ví dụ, 'cout <<" ab \ 0c "[3]' <- 'c' –

+0

Nếu bạn muốn kiểm tra" chuỗi "như thế bạn cần sử dụng' vector 'theo định nghĩa trong chuỗi C++ là 0 - đã hoàn thành. – RedX

Trả lời

22

Bạn đang sử dụng toán tử so sánh std::string với const char*. Trong hàm đó, const char* được giả định là trỏ đến chuỗi c-null bị chấm dứt (tức là '\0'). Kể từ khi các '\t' đến sau khi terminator, chức năng không xem xét nó như là một phần của chuỗi, và trên thực tế, sẽ không có cách nào tốt ngay cả khi có thể tìm ra rằng nó đã có.

Bạn có thể làm điều này:

if (s == std::string("\0\t",2)) 

Điều đó sẽ xây dựng một std::string với chuỗi đầy đủ chữ (trừ chấm dứt '\0' rằng trình biên dịch thêm), và sẽ so sánh chuỗi của bạn với điều đó.

+0

Cảm ơn! Đó là những gì tôi cần thực sự! –

5

Ngoài câu trả lời của Benjamins. C++ 14 giới thiệu các chuỗi ký tự. Nó cho phép bạn chỉ định rằng một chuỗi char (như "a \ 0bc") nên được coi là một chuỗi. Bạn chỉ cần có bạn s hậu tố.

using namespace std::string_literals; 

if (s == "\0\t"s) 
+0

Cảm ơn, nó rất tuyệt, nhưng tôi không thể sử dụng tính năng này trong dự án của tôi vì sự ràng buộc của trình biên dịch. –

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