Question

Comment dois-je obtenir le nombre de caractères dans une chaîne en C ++?

Était-ce utile?

La solution

Si vous utilisez un std::string, appelez length() :

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

Si vous utilisez un c-string, appelez strlen() .

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

Ou, si vous arrivez à vous en utilisant des chaînes de style Pascal (ou f ***** chaînes comme Joel Spolsky aime les appeler quand ils ont un NULL final), juste déréférencer le premier caractère.

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

Autres conseils

Lorsque vous traitez avec des chaînes C ++ (std :: string), vous cherchez () ou () . Les deux devraient vous fournir la même valeur. Toutefois, lorsque le traitement avec des chaînes C-style, vous pouvez utiliser 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;
}

Sortie:

6
6
6
6

Cela dépend de quel type chaîne que vous parlez. Il existe plusieurs types de chaînes:

  1. const char* - une chaîne de caractères multi-octets C-style
  2. const wchar_t* - une grande chaîne C de style
  3. std::string - un "standard" chaîne multi-octets
  4. std::wstring - une grande chaîne "standard"

Pour 3 et 4, vous pouvez utiliser des méthodes de .size() ou .length().

Pour 1, vous pouvez utiliser strlen(), mais vous devez vous assurer que la variable de chaîne est NULL (=== 0)

Pour 2, vous pouvez utiliser wcslen(), mais vous devez vous assurer que la variable de chaîne est NULL (=== 0)

Il existe d'autres types de chaînes dans les bibliothèques non standard C ++, comme le CString de MFC, le CComBSTR ATL, le ACE_CString d'ACE, et ainsi de suite, avec des méthodes telles que .GetLength(), et ainsi de suite. Je ne me souviens pas des détails de tous dès le sommet de ma tête.

STLSoft bibliothèques ont abstraire tout cela avec ce qu'ils appellent Cet article décrit comment tout cela fonctionne, car il est pas tout tout à fait évident ou facile.

Si vous utilisez vieux, chaîne de style C au lieu des nouvelles, des chaînes de style STL, il y a la fonction strlen dans la bibliothèque de l'exécution C:

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

si vous utilisez std :: string, il existe deux méthodes communes pour que:

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

si vous utilisez la chaîne de style C (en utilisant char * ou const char *), vous pouvez utiliser:

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

.length et .Size sont synonymes, je pense juste que « longueur » est un mot un peu plus clair.

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

pour un objet chaîne réelle:

yourstring.length();

ou

yourstring.size();

En C ++ std :: string la méthode longueur () et la taille () vous donne le nombre d'octets, et pas nécessairement le nombre de caractères!. Même avec la fonction sizeof () c-Style!

Pour la plupart des caractères ASCII 7 bits imprimables c'est la même valeur, mais pour les caractères qui ne sont pas 7Bit-ASCII, il est certainement pas. Voir l'exemple ci-dessous pour vous donner les résultats réels (Linux 64 bits).

Il n'y a pas simple, c / c ++ fonction qui peut vraiment compter le nombre de caractères. Soit dit en passant, toutes ces choses dépend la mise en œuvre et peut être différent sur d'autres environnements (compilateur, gagner 16/32, linux, embarqué, ...)

Voir l'exemple suivant:

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

La sortie de l'exemple est la suivante:

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

Simplest façon d'obtenir une longueur de chaîne sans se soucier de l'espace de noms std est la suivante

string avec / sans espaces

#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 sans espaces

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

Pour Unicode

Plusieurs réponses ici ont abordé cette .length() donne des résultats erronés avec des caractères multi-octets, mais il y a 11 réponses et aucun d'entre eux ont fourni une solution.

Le cas de Zalgo

Tout d'abord, il est important de savoir ce que vous entendez par « longueur ». Pour un exemple motivant, considérer la chaîne « Zalgo » (notez que certaines langues, notamment thaïlandais, utilisent en fait la combinaison des signes diacritiques, donc ce n'est pas juste utile pour les mèmes âgés de 15 ans, mais il est évident qui est l'utilisation le plus important cas). On suppose qu'il est codé dans UTF-8 . Il y a 3 façons dont nous pouvons parler de la longueur de cette chaîne:

95 octets

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 graphèmes

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

Trouver les longueurs en utilisant soins intensifs

Il y a des classes C pour des soins intensifs, mais ils exigent la conversion en UTF-16. Vous pouvez utiliser les types C et macros directement pour obtenir un certain soutien UTF-8:

#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̵̡̡̼͚̐ͯ̅ͪ̆ͣ̚");
}

Cette affiche:

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 enveloppements soins intensifs, et peut fournir une interface plus agréable. Cependant, il faut toujours conversion / UTF-16.

Il est peut-être la meilleure façon d'entrer une chaîne et trouver sa longueur.

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

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top