Frage

Wie soll ich die Anzahl der Zeichen in einer Zeichenfolge in C ++ zu bekommen?

War es hilfreich?

Lösung

Wenn Sie eine std::string verwenden, rufen Sie length() :

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

Wenn Sie eine c-string verwenden, rufen Sie strlen() .

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

Oder, wenn Sie sich gerade wie Pascal-Strings (oder f ***** Strings als Joel Spolsky mag sie nennen , wenn sie ein abschließendes NULL) haben, nur dereferenzieren das erste Zeichen.

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

Andere Tipps

Wenn Sie mit C ++ Strings (std :: string) zu tun, die Sie suchen length () oder size () . Beide sollten Sie mit dem gleichen Wert liefern. Allerdings, wenn mit C-Strings zu tun, würden Sie strlen () verwenden.

#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;
}

Ausgang:

6
6
6
6

Es hängt davon ab, welche String-Typ du redest. Es gibt viele Arten von Strings:

  1. const char* - ein C-Stil Multibyte-String
  2. const wchar_t* - ein C-Stil breiter Zeichenfolge
  3. std::string - ein "Standard" Multibyte-String
  4. std::wstring - ein "Standard" wide Zeichenfolge

Für 3 und 4 können Sie .size() oder .length() Methoden verwenden.

Für 1, können Sie strlen(), aber Sie müssen sicherstellen, dass die String-Variable nicht NULL ist (=== 0)

2, können Sie wcslen(), aber Sie müssen sicherstellen, dass die String-Variable nicht NULL ist (=== 0)

Es gibt andere String-Typen in Nicht-Standard-C ++ Bibliotheken, wie MFC CString, ATL CComBSTR, ACE ACE_CString, und so weiter, mit Methoden wie .GetLength(), und so weiter. Ich kann mich nicht erinnern, die Besonderheiten von allen direkt an der Spitze von meinem Kopf.

Die STLSoft Bibliotheken haben dies mit alle aus abstrahiert, was sie nennen dieser Artikel beschreibt, wie das alles funktioniert, wie es ist nicht alles ganz klar oder leicht.

Wenn Sie mit alten, C-String anstelle der neueren, STL-Strings, gibt es die strlen Funktion in der C-Laufzeitbibliothek:

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

Wenn Sie verwenden std :: string, gibt es zwei gängige Methoden dafür:

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

Wenn Sie den C-Stil-String verwenden (char * oder char * verwenden), dann können Sie verwenden:

const char *pStr = "Some String";
size_t Size = strlen(pStr);
string foo;
... foo.length() ...

.length und .Size auch ist, ich denke nur, dass „Länge“ ist ein etwas klareres Wort.

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

für ein tatsächliches String-Objekt:

yourstring.length();

oder

yourstring.size();

In C ++ std :: string die Länge () und Größe () Methode gibt Ihnen die Anzahl von Bytes, und nicht unbedingt die Anzahl der Zeichen!. Gleiche mit der c-Style Funktion sizeof ()

Für die meisten der bedruckbaren 7bit-ASCII-Zeichen ist dies der gleiche Wert, aber für Zeichen, die nicht-ASCII 7bit sind es definitiv nicht. Das folgende Beispiel zeigt Ihnen echte Ergebnisse (64-Bit-Linux) zu geben.

Es gibt keine einfache c / c ++ Funktion, die wirklich die Anzahl der Zeichen zählen. By the way, all dieses Zeug ist die Umsetzung abhängig und kann auf andere Umgebungen unterschiedlich sein (Compiler, gewinnen 16/32, Linux, Embedded, ...)

Siehe folgendes Beispiel:

#include <string>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int main()
{
/* c-Style char Array */
const char * Test1 = "1234";
const char * Test2 = "ÄÖÜ€";
const char * Test3 = "αβγ𝄞";

/* c++ string object */
string sTest1 = "1234";
string sTest2 = "ÄÖÜ€";
string sTest3 = "αβγ𝄞";

printf("\r\nC Style Resluts:\r\n");
printf("Test1: %s, strlen(): %d\r\n",Test1, (int) strlen(Test1));
printf("Test2: %s, strlen(): %d\r\n",Test2, (int) strlen(Test2));
printf("Test3: %s, strlen(): %d\r\n",Test3, (int) strlen(Test3));

printf("\r\nC++ Style Resluts:\r\n");
cout << "Test1: " << sTest1 << ", Test1.size():  " <<sTest1.size() <<"  sTest1.length(): " << sTest1.length() << endl;
cout << "Test1: " << sTest2 << ", Test2.size():  " <<sTest2.size() <<"  sTest1.length(): " << sTest2.length() << endl;
cout << "Test1: " << sTest3 << ", Test3.size(): " <<sTest3.size() << "  sTest1.length(): " << sTest3.length() << endl;
return 0;
}

Die Ausgabe des Beispiels ist dies:

C Style Results:
Test1: ABCD, strlen(): 4    
Test2: ÄÖÜ€, strlen(): 9
Test3: αβγ𝄞, strlen(): 10

C++ Style Results:
Test1: ABCD, sTest1.size():  4  sTest1.length(): 4
Test2: ÄÖÜ€, sTest2.size():  9  sTest2.length(): 9
Test3: αβγ𝄞, sTest3.size(): 10  sTest3.length(): 10

einfachste Art und Weise die Länge der Zeichenfolge zu erhalten, ohne sich um std-Namespace ist wie folgt

string mit / ohne Leerzeichen

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

string ohne Leerzeichen

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

Für Unicode

Mehrere Antworten hier haben angesprochen, dass .length() die falschen Ergebnisse mit Multibyte-Zeichen gibt, aber es gibt 11 Antworten und keine von ihnen hat eine Lösung zur Verfügung gestellt.

Der Fall Z͉̳̺ͥͬ̾a̴͕̒̒͌̋ͪl̨͎̰̘͉̟ͤ̈̚͜g͕͔̤͖̟̒͝o̵̡̡̼͚̐ͯ̅ͪ̆ͣ̚

Zunächst einmal ist es wichtig zu wissen, was Sie mit „Länge“ bedeuten. Für ein motivierendes Beispiel betrachten wir die Zeichenfolge „Z͉̳̺ͥͬ̾a̴͕̒̒͌̋ͪl̨͎̰̘͉̟ͤ̈̚͜g͕͔̤͖̟̒͝o̵̡̡̼͚̐ͯ̅ͪ̆ͣ̚“ (beachten Sie, dass einige Sprachen, vor allem Thai, verwenden Sie eigentlich diakritische Zeichen kombinieren, so ist dies nicht nur nützlich für die 15-jährige Meme, aber offensichtlich das ist der wichtigste Anwendungsfall). Nehmen wir es in UTF-8 codiert wird. Es gibt 3 Möglichkeiten, wir können über die Länge dieser Zeichenfolge sprechen:

95 Bytes

00000000: 5acd a5cd accc becd 89cc b3cc ba61 cc92  Z............a..
00000010: cc92 cd8c cc8b cdaa ccb4 cd95 ccb2 6ccd  ..............l.
00000020: a4cc 80cc 9acc 88cd 9ccc a8cd 8ecc b0cc  ................
00000030: 98cd 89cc 9f67 cc92 cd9d cd85 cd95 cd94  .....g..........
00000040: cca4 cd96 cc9f 6fcc 90cd afcc 9acc 85cd  ......o.........
00000050: aacc 86cd a3cc a1cc b5cc a1cc bccd 9a    ...............

50 Codepoints

LATIN CAPITAL LETTER Z
COMBINING LEFT ANGLE BELOW
COMBINING DOUBLE LOW LINE
COMBINING INVERTED BRIDGE BELOW
COMBINING LATIN SMALL LETTER I
COMBINING LATIN SMALL LETTER R
COMBINING VERTICAL TILDE
LATIN SMALL LETTER A
COMBINING TILDE OVERLAY
COMBINING RIGHT ARROWHEAD BELOW
COMBINING LOW LINE
COMBINING TURNED COMMA ABOVE
COMBINING TURNED COMMA ABOVE
COMBINING ALMOST EQUAL TO ABOVE
COMBINING DOUBLE ACUTE ACCENT
COMBINING LATIN SMALL LETTER H
LATIN SMALL LETTER L
COMBINING OGONEK
COMBINING UPWARDS ARROW BELOW
COMBINING TILDE BELOW
COMBINING LEFT TACK BELOW
COMBINING LEFT ANGLE BELOW
COMBINING PLUS SIGN BELOW
COMBINING LATIN SMALL LETTER E
COMBINING GRAVE ACCENT
COMBINING DIAERESIS
COMBINING LEFT ANGLE ABOVE
COMBINING DOUBLE BREVE BELOW
LATIN SMALL LETTER G
COMBINING RIGHT ARROWHEAD BELOW
COMBINING LEFT ARROWHEAD BELOW
COMBINING DIAERESIS BELOW
COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
COMBINING PLUS SIGN BELOW
COMBINING TURNED COMMA ABOVE
COMBINING DOUBLE BREVE
COMBINING GREEK YPOGEGRAMMENI
LATIN SMALL LETTER O
COMBINING SHORT STROKE OVERLAY
COMBINING PALATALIZED HOOK BELOW
COMBINING PALATALIZED HOOK BELOW
COMBINING SEAGULL BELOW
COMBINING DOUBLE RING BELOW
COMBINING CANDRABINDU
COMBINING LATIN SMALL LETTER X
COMBINING OVERLINE
COMBINING LATIN SMALL LETTER H
COMBINING BREVE
COMBINING LATIN SMALL LETTER A
COMBINING LEFT ANGLE ABOVE

5 Grapheme

Z with some s**t
a with some s**t
l with some s**t
g with some s**t
o with some s**t

Das Finden der Längen mit ICU

Es gibt C ++ Klassen für ICU, aber sie erfordern die Umstellung auf UTF-16. Sie können die C-Typen und Makros direkt einige UTF-8-Unterstützung zu erhalten:

#include <memory>
#include <iostream>
#include <unicode/utypes.h>
#include <unicode/ubrk.h>
#include <unicode/utext.h>

//
// C++ helpers so we can use RAII
//
// Note that ICU internally provides some C++ wrappers (such as BreakIterator), however these only seem to work
// for UTF-16 strings, and require transforming UTF-8 to UTF-16 before use.
// If you already have UTF-16 strings or can take the performance hit, you should probably use those instead of
// the C functions. See: http://icu-project.org/apiref/icu4c/
//
struct UTextDeleter { void operator()(UText* ptr) { utext_close(ptr); } };
struct UBreakIteratorDeleter { void operator()(UBreakIterator* ptr) { ubrk_close(ptr); } };
using PUText = std::unique_ptr<UText, UTextDeleter>;
using PUBreakIterator = std::unique_ptr<UBreakIterator, UBreakIteratorDeleter>;

void checkStatus(const UErrorCode status)
{
    if(U_FAILURE(status))
    {
        throw std::runtime_error(u_errorName(status));
    }
}

size_t countGraphemes(UText* text)
{
    // source for most of this: http://userguide.icu-project.org/strings/utext
    UErrorCode status = U_ZERO_ERROR;
    PUBreakIterator it(ubrk_open(UBRK_CHARACTER, "en_us", nullptr, 0, &status));
    checkStatus(status);
    ubrk_setUText(it.get(), text, &status);
    checkStatus(status);
    size_t charCount = 0;
    while(ubrk_next(it.get()) != UBRK_DONE)
    {
        ++charCount;
    }
    return charCount;
}

size_t countCodepoints(UText* text)
{
    size_t codepointCount = 0;
    while(UTEXT_NEXT32(text) != U_SENTINEL)
    {
        ++codepointCount;
    }
    // reset the index so we can use the structure again
    UTEXT_SETNATIVEINDEX(text, 0);
    return codepointCount;
}

void printStringInfo(const std::string& utf8)
{
    UErrorCode status = U_ZERO_ERROR;
    PUText text(utext_openUTF8(nullptr, utf8.data(), utf8.length(), &status));
    checkStatus(status);

    std::cout << "UTF-8 string (might look wrong if your console locale is different): " << utf8 << std::endl;
    std::cout << "Length (UTF-8 bytes): " << utf8.length() << std::endl;
    std::cout << "Length (UTF-8 codepoints): " << countCodepoints(text.get()) << std::endl;
    std::cout << "Length (graphemes): " << countGraphemes(text.get()) << std::endl;
    std::cout << std::endl;
}

void main(int argc, char** argv)
{
    printStringInfo(u8"Hello, world!");
    printStringInfo(u8"หวัดดีชาวโลก");
    printStringInfo(u8"\xF0\x9F\x90\xBF");
    printStringInfo(u8"Z͉̳̺ͥͬ̾a̴͕̲̒̒͌̋ͪl̨͎̰̘͉̟ͤ̀̈̚͜g͕͔̤͖̟̒͝ͅo̵̡̡̼͚̐ͯ̅ͪ̆ͣ̚");
}

Dieser Befehl gibt:

UTF-8 string (might look wrong if your console locale is different): Hello, world!
Length (UTF-8 bytes): 13
Length (UTF-8 codepoints): 13
Length (graphemes): 13

UTF-8 string (might look wrong if your console locale is different): หวัดดีชาวโลก
Length (UTF-8 bytes): 36
Length (UTF-8 codepoints): 12
Length (graphemes): 10

UTF-8 string (might look wrong if your console locale is different): 🐿
Length (UTF-8 bytes): 4
Length (UTF-8 codepoints): 1
Length (graphemes): 1

UTF-8 string (might look wrong if your console locale is different): Z͉̳̺ͥͬ̾a̴͕̲̒̒͌̋ͪl̨͎̰̘͉̟ͤ̀̈̚͜g͕͔̤͖̟̒͝ͅo̵̡̡̼͚̐ͯ̅ͪ̆ͣ̚
Length (UTF-8 bytes): 95
Length (UTF-8 codepoints): 50
Length (graphemes): 5

Boost.Locale ICU Wraps, und könnte eine schönere Schnittstelle zur Verfügung stellen. Es erfordert jedoch noch Konvertierung zu / von UTF-16.

Es könnte der einfachste Weg, um eingegeben werden einen String und seine Länge finden.

// 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());

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top