Jak powinienem uzyskać liczbę znaków w łańcuchu w C++?Jak uzyskać liczbę znaków w std :: string?
Odpowiedz
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"
Kto przy zdrowych zmysłach używałby struny w stylu Pascala? – Xarn
doesnt length() zwraca liczbę bajtów, a nie liczbę znaków? –
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
string foo;
... foo.length() ...
. Długość i .size są synonimami, po prostu uważam, że "długość" jest nieco jaśniejszym słowem.
size() jest uniwersalny w różnych kontenerach. – rlbond
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
@LaQuet, jeśli nie używasz zgodnego ze standardami kompilatora lub implementacji STL, masz więcej powodów do zmartwienia. – strager
std::string str("a string");
std::cout << str.size() << std::endl;
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
dla rzeczywistego obiektu String:
yourstring.length();
lub
yourstring.size();
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);
To zależy od tego, jakiego typu ciąg mówisz. Istnieje wiele rodzajów strun:
const char*
- C-styl wielobajtowej strunoweconst wchar_t*
- C-styl szeroki ciągstd::string
- "standard" wielobajtowej ciągstd::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.
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);
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());
}
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
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;
}
- 1. jak uzyskać liczbę "#" w ciągu znaków?
- 2. Jak uzyskać liczbę argumentów `std :: function`?
- 3. Konwersja std :: __ cxx11 :: string na std :: string
- 4. Różnica między std: string i std :: string
- 5. Przekształcanie łańcucha znaków w stylu C w std :: string
- 6. Jak zrobić "getline" ze std :: string?
- 7. Pobierz bajty ze std :: string w C++
- 8. Definiowanie std :: string w C++ bez znaków kontrolnych
- 9. Jak uzyskać wiarygodną liczbę znaków Unicode w Pythonie?
- 10. JTextField: Jak ograniczyć liczbę znaków?
- 11. Sortowanie std :: wektor <std :: pair <std :: string, bool >> według ciągu znaków?
- 12. Jak przekonwertować std :: string do v8 Local <string>
- 13. Efektywna konstrukcja std :: string z std :: unordered_set <char>
- 14. std :: string, wstring, u16/32 objaśnienie łańcuchów znaków
- 15. Jak policzyć liczbę unikalnych znaków w pliku?
- 16. std :: string :: zastąpienie standardowej implementacji?
- 17. C++ std :: string append vs push_back()
- 18. std :: string na LPCTSTR
- 19. usuń spacje w std :: string
- 20. Czy wyrażenie "std :: string + char" tworzy kolejny ciąg std :: string?
- 21. doładowanie :: przycinanie każdego ciągu znaków w std :: vector <std::string>
- 22. Jaka jest różnica między :: std :: string i std :: string?
- 23. operator std :: string() const?
- 24. C++ std :: map <std :: string, int> uzyskać wartości, których klucz zaczyna się od określonego ciągu znaków
- 25. Jak uzyskać liczbę wyliczeń?
- 26. std :: wektor <std::string> crash
- 27. Jak zliczyć liczbę znaków w zmiennej Bash?
- 28. Jak odczytać nieograniczoną liczbę znaków w C
- 29. Jak SWIG std :: string & do C# ref string
- 30. Używanie std :: string jako klucza do std :: map
Jakie masz do czynienia z łańcuchami? std :: string? Ciąg c? null zakończony łańcuchem? –
Najbardziej niepoprawnym sposobem byłoby przepuszczenie go przez pętlę i policzenie znaków. – Krythic