2009-05-25 20 views
91

Jak powinienem uzyskać liczbę znaków w łańcuchu w C++?Jak uzyskać liczbę znaków w std :: string?

+0

Jakie masz do czynienia z łańcuchami? std :: string? Ciąg c? null zakończony łańcuchem? –

+0

Najbardziej niepoprawnym sposobem byłoby przepuszczenie go przez pętlę i policzenie znaków. – Krythic

Odpowiedz

154

Jeśli używasz std::string, zadzwoń length():

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

Jeśli używasz c-string, zadzwoń strlen().

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

Lub, jeśli zdarzy ci się podoba pomocą ciągów Pascal stylu (lub f ***** ciągi jako Joel Spolsky likes to call them kiedy mają z tyłu NULL), po prostu dereference pierwszego znaku.

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

Kto przy zdrowych zmysłach używałby struny w stylu Pascala? – Xarn

+5

doesnt length() zwraca liczbę bajtów, a nie liczbę znaków? –

+2

Dla std :: string, jest to to samo (chyba że przechowujesz kodowanie o zmiennej długości lub używasz std :: string do przechowywania znaków wielobajtowych). Jeśli to robisz, nie dostaniesz żadnej pomocy z niczego z biblioteki standardowej, więc możesz poradzić sobie z toczeniem własnych strlenów. Wstring, u16string i u32string zwraca liczbę znaków, a nie bajty. (Znowu z zastrzeżeniem, że jeśli używasz kodowania o zmiennej długości w którymkolwiek z nich, będziesz musiał rzucić własnym strlenem). – Eclipse

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

. Długość i .size są synonimami, po prostu uważam, że "długość" jest nieco jaśniejszym słowem.

+1

size() jest uniwersalny w różnych kontenerach. – rlbond

+0

size() jest odradzany, ponieważ pamiętam, że słyszałem, że w niektórych implementacjach zwróci on "length() + 1" (ponieważ zawiera terminator o wartości null). Więc używaj length(), ponieważ jest czystszy i bardziej przenośny. – nlaq

+1

@LaQuet, jeśli nie używasz zgodnego ze standardami kompilatora lub implementacji STL, masz więcej powodów do zmartwienia. – strager

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

Gdy mamy do czynienia z C++ ciągi (std :: string), szukasz length() lub size(). Obie powinny zapewniać tę samą wartość. Jednak w przypadku ciągów w stylu C użyjemy 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; 
} 

wyjściowa:

6 
6 
6 
6 
+3

pamiętać, że można uniknąć ostrzeżenia kompilatora (w niektórych kompilatory C++) za pomocą #include zamiast nieaktualnych #include Colin

+1

+1 za bycie tylko osoba, która wspomina o załącznikach. – MikeKulls

2

dla rzeczywistego obiektu String:

yourstring.length(); 

lub

yourstring.size(); 
3

Jeśli używasz starego, C-style smyczkową zamiast n dzbanek, ciągi STL stylu, istnieje funkcja strlen w bibliotece czasu pracy C:

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

To zależy od tego, jakiego typu ciąg mówisz. Istnieje wiele rodzajów strun:

  1. const char* - C-styl wielobajtowej strunowe
  2. const wchar_t* - C-styl szeroki ciąg
  3. std::string - "standard" wielobajtowej ciąg
  4. std::wstring - A " standard "szeroki ciąg"

Dla 3 i 4 można stosować metody .size() lub .length().

za 1, można użyć strlen(), ale należy upewnić się, że zmienna ciąg nie jest NULL (=== 0)

dla 2, można użyć wcslen(), ale należy upewnić się, że łańcuch jest zmienna nie NULL (=== 0)

Istnieją inne rodzaje strun w nietypowych ++ bibliotek C, takie jak MFC CString, ATL na CComBSTR, ACE ACE_CString, i tak dalej, z metod, takich jak .GetLength(), i tak dalej. Nie pamiętam dokładnie ich wszystkich z mojej głowy.

W STLSoft biblioteki zostały oderwane to wszystko się z tym, co nazywają string access shims, które mogą być używane, aby uzyskać długość ciągu (i inne aspekty) z dowolnego typu. Tak więc dla wszystkich powyższych (w tym niestandardowych bibliotek) przy użyciu tej samej funkcji stlsoft::c_str_len(). This article opisuje, jak to wszystko działa, ponieważ nie jest to całkowicie oczywiste lub łatwe.

3

jeśli używasz std :: string, istnieją dwie powszechne metody to:

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

jeśli używasz ciąg C styl (przy użyciu char * lub const char *), a następnie można użyj:

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

Może to być najłatwiejszy sposób wpisania ciągu znaków i znalezienia jego długości.

// 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

Co to jest, że liczba (ciąg) powoduje, że ciąg :: length() nie? Poza tym niepotrzebnie tworzy dodatkową kopię łańcucha i zwraca wartość ujemną, jeśli w ciągu znaków znajduje się więcej niż 2 miliardy znaków. – Eclipse

0

Najprostszy sposób, aby uzyskać długość sznurka, nie dbając o przestrzeni nazw std jest następująca

ciąg z/bez spacji

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

ciąg bez spacji

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