2009-05-25 66 views
91

Làm cách nào để nhận được số ký tự trong một chuỗi trong C++?Cách lấy số ký tự trong chuỗi std ::?

+0

Những loại dây bạn đang xử lý? std :: string? chuỗi C? null chấm dứt chuỗi? –

+0

Cách chống lừa đảo nhất sẽ là để lặp qua nó và đếm các ký tự cho mình. Tuy nhiên, kích thước – Krythic

Trả lời

154

Nếu bạn đang sử dụng một std::string, gọi length():

std::string str = "hello"; 
std::cout << str << ":" << str.length(); 
// Outputs "hello:5" 

Nếu bạn đang sử dụng một c-string, gọi strlen().

const char *str = "hello"; 
std::cout << str << ":" << strlen(str); 
// Outputs "hello:5" 

Hoặc, nếu bạn tình cờ thích sử dụng chuỗi Pascal kiểu (hoặc f ***** chuỗi như Joel Spolsky likes to call them khi họ có một NULL trailing), chỉ dereference ký tự đầu tiên.

const char *str = "\005hello"; 
std::cout << str + 1 << ":" << *str; 
// Outputs "hello:5" 
+3

Ai trong tâm trí của họ sẽ sử dụng các chuỗi kiểu Pascal? – Xarn

+5

không dài() trả về số byte, không phải số ký tự? –

+2

Đối với chuỗi std ::, nó giống nhau (trừ khi bạn đang lưu trữ mã hóa độ dài biến đổi hoặc sử dụng chuỗi std :: để lưu trữ các ký tự nhiều byte). Nếu bạn đang làm điều đó, bạn sẽ không nhận được nhiều sự giúp đỡ với bất cứ điều gì từ thư viện std, vì vậy bạn có thể xử lý cán strlen của riêng bạn là tốt. Đối với wstring, u16string và u32string, nó trả về số ký tự thay vì byte. (Một lần nữa với điều kiện rằng nếu bạn đang sử dụng một mã hóa có độ dài thay đổi trong bất kỳ của những người, bạn sẽ phải cuộn strlen của riêng bạn). – Eclipse

2
string foo; 
... foo.length() ... 

.length và .size đồng nghĩa, tôi chỉ nghĩ rằng "length" là một từ hơi rõ ràng hơn.

+1

() là phổ quát trên các vùng chứa. – rlbond

+0

kích thước() được khuyến khích bởi vì tôi nhớ nghe điều đó trong một số triển khai nó sẽ trả về "length() + 1" (vì nó bao gồm null terminator). Vì vậy, chỉ cần sử dụng chiều dài() vì nó sạch hơn và di động hơn. – nlaq

+1

@LaQuet, Nếu bạn không sử dụng trình biên dịch tuân thủ tiêu chuẩn hoặc triển khai STL, bạn có nhiều điều phải lo lắng hơn. – strager

2
std::string str("a string"); 
std::cout << str.size() << std::endl; 
20

Khi giao dịch với C++ chuỗi (std :: string), bạn đang tìm kiếm length() hoặc size(). Cả hai sẽ cung cấp cho bạn cùng một giá trị. Tuy nhiên, khi xử lý các chuỗi C-Style, bạn sẽ sử dụng strlen().

#include <iostream> 
#include <string.h> 

int main(int argc, char **argv) 
{ 
    std::string str = "Hello!"; 
    const char *otherstr = "Hello!"; // C-Style string 
    std::cout << str.size() << std::endl; 
    std::cout << str.length() << std::endl; 
    std::cout << strlen(otherstr) << std::endl; // C way for string length 
    std::cout << strlen(str.c_str()) << std::endl; // convert C++ string to C-string then call strlen 
    return 0; 
} 

Output:

6 
6 
6 
6 
+3

Lưu ý rằng bạn có thể tránh các cảnh báo trình biên dịch (trong một số trình biên dịch C++) bằng cách sử dụng #include thay vì phản đối #include Colin

+1

1 vì là chỉ có người đề cập đến bao gồm. – MikeKulls

2

cho một đối tượng chuỗi thực tế:

yourstring.length(); 

hoặc

yourstring.size(); 
3

Nếu bạn đang sử dụng cũ, C kiểu chuỗi thay vì n cái bình đựng nước, chuỗi STL-phong cách, có các strlen chức năng trong thư viện thời gian chạy C:

const char* p = "Hello"; 
size_t n = strlen(p); 
15

Nó phụ thuộc vào loại chuỗi bạn đang nói về. Có rất nhiều loại dây:

  1. const char* - một C-style multibyte chuỗi
  2. const wchar_t* - một C-style rộng chuỗi
  3. std::string - một "chuẩn" multibyte chuỗi
  4. std::wstring - một " tiêu chuẩn "chuỗi rộng

Đối với 3 và 4, bạn có thể sử dụng phương pháp .size() hoặc .length().

Đối với 1, bạn có thể sử dụng strlen(), nhưng bạn phải đảm bảo rằng các biến chuỗi không phải là NULL (=== 0)

Đối với 2, bạn có thể sử dụng wcslen(), nhưng bạn phải đảm bảo rằng các biến chuỗi là không phải là NULL (=== 0)

có nhiều loại chuỗi khác trong thư viện phi tiêu chuẩn C++, chẳng hạn như MFC của CString, ATL của CComBSTR, ACE của ACE_CString, và như vậy, với các phương pháp như .GetLength(), và vân vân. Tôi không thể nhớ những chi tiết cụ thể của tất cả chúng ngay từ đầu tôi.

Thư viện STLSoft đã trừu tượng hóa tất cả những gì họ gọi là string access shims, có thể được sử dụng để nhận độ dài chuỗi (và các khía cạnh khác) từ bất kỳ loại nào. Vì vậy, cho tất cả các bên trên (bao gồm cả những thư viện không chuẩn) sử dụng cùng chức năng stlsoft::c_str_len(). This article mô tả cách hoạt động của nó, vì nó không hoàn toàn rõ ràng hoặc dễ dàng.

3

nếu bạn đang sử dụng std :: string, có hai phương pháp phổ biến cho rằng:

std::string Str("Some String"); 
size_t Size = 0; 
Size = Str.size(); 
Size = Str.length(); 

nếu bạn đang sử dụng chuỗi C phong cách (sử dụng char * hoặc const char *) sau đó bạn có thể sử dụng:

const char *pStr = "Some String"; 
size_t Size = strlen(pStr); 
0

Đây có thể là cách dễ nhất để nhập chuỗi và tìm chiều dài của chuỗi.

// Finding length of a string in C++ 
#include<iostream> 
#include<string> 
using namespace std; 

int count(string); 

int main() 
{ 
string str; 
cout << "Enter a string: "; 
getline(cin,str); 
cout << "\nString: " << str << endl; 
cout << count(str) << endl; 

return 0; 

} 

int count(string s){ 
if(s == "") 
    return 0; 
if(s.length() == 1) 
    return 1; 
else 
    return (s.length()); 

} 
+3

Điều gì mà bạn nghĩ rằng đếm (chuỗi) nào chuỗi đó :: length() không? Bên cạnh việc không cần thiết tạo thêm một bản sao của chuỗi và trả về giá trị âm nếu có hơn 2 tỷ ký tự trong chuỗi. – Eclipse

0

Cách đơn giản nhất để có được chiều dài của chuỗi mà không cần bận tâm về namespace std như sau

chuỗi có/không có không gian

#include <iostream> 
#include <string> 
using namespace std; 
int main(){ 
    string str; 
    getline(cin,str); 
    cout<<"Length of given string is"<<str.length(); 
    return 0; 
} 

chuỗi không có khoảng

#include <iostream> 
#include <string> 
using namespace std; 
int main(){ 
    string str; 
    cin>>str; 
    cout<<"Length of given string is"<<str.length(); 
    return 0; 
} 
Các vấn đề liên quan