2010-09-16 32 views
5

Tôi muốn biết vị trí của các "_" trong một chuỗi:Làm cách nào để phát hiện "_" trong chuỗi C++?

string str("BLA_BLABLA_BLA.txt"); 

Cái gì như:

string::iterator it; 
for (it=str.begin() ; it < str.end(); it++){ 
if (*it == "_")   //this goes wrong: pointer and integer comparison 
{ 
    pos(1) = it; 
} 
cout << *it << endl; 
} 

Cảm ơn, André

+5

Thử sử dụng dấu nháy đơn thay vì dấu ngoặc kép. –

+0

@Dominic tại sao đây không phải là câu trả lời? – Motti

+0

@Motti - bây giờ là (xem câu trả lời của sbi http://stackoverflow.com/questions/3725574/detect-in-a-string/3725671#3725671) –

Trả lời

6

Bạn có thể tận dụng các find chức năng như:

string str = "BLA_BLABLA_BLA.txt"; 
size_t pos = -1; 

while((pos=str.find("_",pos+1)) != string::npos) { 
     cout<<"Found at position "<<pos<<endl; 
} 

Output:

Found at position 3 
Found at position 10 
+0

Câu trả lời là sai. Bất kể bạn có cung cấp vị trí ban đầu hay không, 'std :: string :: find' sẽ trả về vị trí * trong chuỗi *. Dòng 'pos + = found + 1' sẽ được thay đổi thành 'pos = found + 1', và trong khi bạn đang ở đó, toàn bộ biến' found' có thể được xóa bằng cách khởi tạo 'pos' thành' -1', đi qua 'pos + 1' đến' find' và lưu trữ giá trị trả về trong 'pos'. Hãy thử với "BLA_BLABLA_BLA_BLA.txt", nó sẽ chỉ phát hiện hai chữ cái đầu tiên '_'. –

9
std::find(str.begin(), str.end(), '_'); 
           // ^Single quote! 
16

Lưu ý rằng "_" là một chuỗi chữ, trong khi '_' là một nhân vật đen.

Nếu bạn không quan tâm đến một trình lặp vào chuỗi, những gì bạn nhận được là một ký tự . Tất nhiên, chỉ có thể so sánh các ký tự với ký tự literals, không được chuỗi literals.

Tuy nhiên, như những người khác đã nhận thấy, bạn không nên tự mình triển khai thuật toán như vậy. Nó đã được thực hiện một triệu lần, hai trong số đó (std::string::find()std::find()) đã kết thúc trong thư viện chuẩn của C++. Sử dụng một trong số đó.

+2

+1 để đề cập đến vấn đề * thực tế * của anh ấy. –

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