Jak uzyskać liczbę znaków w ciągu w C ++?
c++
string
stdstring
string-length
Elliot
źródło
źródło
Odpowiedzi:
Jeśli używasz
std::string
, zadzwońlength()
:Jeśli używasz ciągu c, wywołaj
strlen()
.Lub, jeśli przypadkiem lubisz używać ciągów w stylu Pascala (lub pieprzonych ciągów, jak lubi je nazywać Joel Spolsky, gdy mają na końcu NULL), po prostu dereferencjonuj pierwszy znak.
źródło
std::size_t
.Kiedy mamy do czynienia z ciągami znaków C ++ (std :: string), szukasz length () lub size () . Oba powinny zapewniać tę samą wartość. Jednak w przypadku ciągów w stylu C należy użyć strlen () .
Wynik:
źródło
Zależy to od rodzaju łańcucha, o którym mówisz. Istnieje wiele rodzajów ciągów:
const char*
- ciąg wielobajtowy w stylu C.const wchar_t*
- szeroki sznurek w stylu C.std::string
- „standardowy” ciąg wielobajtowystd::wstring
- „standardowy” szeroki sznurekW przypadku 3 i 4 możesz użyć metod
.size()
lub.length()
.Dla 1 możesz użyć
strlen()
, ale musisz upewnić się, że zmienna łańcuchowa nie ma wartości NULL (=== 0)W przypadku 2 możesz użyć
wcslen()
, ale musisz upewnić się, że zmienna łańcuchowa nie ma wartości NULL (=== 0)Istnieją inne typy ciągów w niestandardowych bibliotekach C ++, takich jak MFC
CString
, ATLCComBSTR
, ACEACE_CString
i tak dalej, z metodami takimi jak.GetLength()
i tak dalej. Nie mogę sobie przypomnieć szczegółów ich wszystkich od samego początku.W STLSoft biblioteki zostały oderwane to wszystko się z tym, co nazywają podkładek ciąg dostępu , które mogą być wykorzystane, aby uzyskać długość ciągu (i inne aspekty) z dowolnego typu. Więc dla wszystkich powyższych (w tym niestandardowych bibliotek) przy użyciu tej samej funkcji
stlsoft::c_str_len()
. W tym artykule opisano, jak to wszystko działa, ponieważ nie jest to całkowicie oczywiste ani łatwe.źródło
W przypadku Unicode
Kilka odpowiedzi tutaj rozwiązało, które
.length()
dają nieprawidłowe wyniki ze znakami wielobajtowymi, ale jest 11 odpowiedzi i żadna z nich nie zapewniła rozwiązania.Przypadek Z͉̳̺ͥͬ̾a̴͕̲̒̒͌̋ͪl̨͎̰̘͉̟ͤ̀̈̚͜g͕͔̤͖̟̒͝ͅo̵̡̡̼͚̐ͯ̅ͪ̆ͣ̚
Przede wszystkim ważne jest, aby wiedzieć, co rozumiesz przez „długość”. Aby uzyskać motywujący przykład, rozważ ciąg „Z͉̳̺ͥͬ̾a̴͕̲̒̒͌̋ͪl̨͎̰̘͉̟ͤ̀̈̚͜g͕͔̤͖̟̒͝ͅo̵̡̡̼͚̐ͯ̅ͪ̆ͣ̚” (zauważ, że niektóre języki, zwłaszcza tajski, używają kombinacji znaków diakrytycznych, więc nie jest to przydatne tylko w przypadku memów 15-letnich, ale oczywiście jest to najważniejszy przypadek użycia) . Załóżmy, że jest zakodowany w UTF-8 . Istnieją 3 sposoby, w jakie możemy mówić o długości tego ciągu:
95 bajtów
50 punktów kodowych
5 grafemów
Znajdowanie długości za pomocą ICU
Istnieją klasy C ++ dla ICU, ale wymagają one konwersji na UTF-16. Możesz użyć typów C i makr bezpośrednio, aby uzyskać obsługę UTF-8:
To drukuje:
Boost.Locale otacza ICU i może zapewnić ładniejszy interfejs. Jednak nadal wymaga konwersji do / z UTF-16.
źródło
Jeśli używasz starego ciągu w stylu C zamiast nowszych ciągów w stylu STL,
strlen
w bibliotece wykonawczej C znajduje się funkcja:źródło
jeśli używasz std :: string, istnieją dwie typowe metody:
jeśli używasz łańcucha w stylu C (używając char * lub const char *), możesz użyć:
źródło
.length i .size to synonimy, po prostu myślę, że „długość” jest nieco jaśniejszym słowem.
źródło
źródło
dla rzeczywistego obiektu typu string:
lub
źródło
W C ++ std :: string metody length () i size () podają liczbę bajtów, a niekoniecznie liczbę znaków!. To samo z funkcją sizeof () w stylu c!
W przypadku większości drukowalnych znaków 7-bitowego ASCII jest to ta sama wartość, ale w przypadku znaków innych niż 7-bitowe ASCII zdecydowanie nie. Zobacz poniższy przykład, aby uzyskać prawdziwe wyniki (64-bitowy system Linux).
Nie ma prostej funkcji c / c ++, która może naprawdę policzyć liczbę znaków. Nawiasem mówiąc, wszystkie te rzeczy zależą od implementacji i mogą różnić się w innych środowiskach (kompilator, win 16/32, linux, embedded, ...)
Zobacz następujący przykład:
Wynik przykładu jest następujący:
źródło
To może być najłatwiejszy sposób na wprowadzenie łańcucha i znalezienie jego długości.
źródło
Najprostszy sposób uzyskania długości łańcucha bez przejmowania się standardową przestrzenią nazw jest następujący
ciąg z / bez spacji
ciąg bez spacji
źródło