質問

いつ、どのように文字数の文字列はC++?

役に立ちましたか?

解決

<:あなたはstd::stringを使用している場合は、

length() を呼び出します/ P>

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

あなたは、C-文字列を使用している場合は、呼び出し strlen()するます。

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

それとも、あなたはパスカルスタイルの文字列(またはジョエル・スポルスキ<のhref =「http://www.joelonsoftware.com/articles/fog0000000319.html」のrel =など***** fの文字列を使って好きなことが起こる場合「noreferrerは」>彼らは、末尾のNULLを持っているときだけ、最初の文字を逆参照、)それらをを呼び出すために好きます。

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

他のヒント

扱う場合にはC++の文字列std::string)、お length() または size().するべきでのご提供と同じ値とする。しかし扱う場合はC-スタイル文字列を使う 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;
}

出力:

6
6
6
6

このように文字列タイプだった。多くの種類の文字列:

  1. const char* -C-スタイルマルチバイト文字列
  2. const wchar_t* -C-スタイルの広い文字列
  3. std::string -標準マルチバイト文字列
  4. std::wstring -標準的な広さの文字列

3および4を使用 .size() または .length() ます。

1を使用でき strlen(), が確認できなかった文字列の変数をNULLではない(===0)

2利用でき wcslen(), が確認できなかった文字列の変数をNULLではない(===0)

ありその他の文字列タイプの非標準C++ライブラリなど、MFCの CString, 不死化の CComBSTR, エースインターナショナルは、の ACE_CString, で、方法など .GetLength(), います。どうかよろしくお願いしますの内容のすべてはトップ?

STLSoft ライブラリが抽象化されたことはこう呼び stringアクシム, きを取得するために使用される文字列の長さ(およびその他の側面からのタイプです。その上に非標準ライブラリにも同じ機能 stlsoft::c_str_len(). この記事 記述するすべての作品ではありません完全に明らかではなかったり、簡単です。

古い使用している場合は、代わりに新しい、STL形式の文字列のCスタイルの文字列、Cランタイムライブラリでstrlen機能があります:

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

あなたがのstd ::文字列を使用している場合は、そのための2つの一般的な方法があります:

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

あなたは(char型の*またはconstのchar *を使用)Cスタイルの文字列を使用している場合は、あなたが使用することができます:

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

.LENGTHと.sizeは同義であり、私は「長さ」は少し明確に言葉だと思います。

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

実際の文字列オブジェクトのために:

yourstring.length();

または

yourstring.size();

C ++のstd ::文字列で長さ()とサイズ()メソッドを使用すると、バイト数、を必ずしも文字数を与える!。を Cスタイルのsizeof()関数と同じ!

印刷可能な7ビットASCII文字のほとんどは、これは同じ値であるが、7ビット-ASCIIでない文字のためにそれは間違いではありません。 あなたの本当の結果(64ビットLinux)を与えるために、次の例を参照してください。

本当に文字の数をカウントすることができます簡単なC / C ++関数はありません。 ところで、このようなもののすべては実装に依存しており、他の環境に異なる場合があり(16/32勝つ、コンパイラ、Linuxでは、埋め込まれた、...)

次の例を参照してください:

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

の例の出力は、この

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

std名前空間を気にせずに文字列の長さを取得する最も簡単な方法です、次のように

スペースなし/付きの文字列

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

スペースなしの文字列

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

ユニコードについては

ここではいくつかの答えは.length()は、マルチバイト文字と間違った結果を与えることを取り上げましたが、11件の回答と、それらのどれもがあるソリューションを提供しています。

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

まず第一に、それはあなたが、「長さ」によって何を意味するか知っておくことが重要です。動機たとえば、文字列「Z͉̳̺ͥͬ̾a̴͕̒̒͌̋ͪl̨͎̰̘͉̟ͤ̈̚͜g͕͔̤͖̟̒͝o̵̡̡̼͚̐ͯ̅ͪ̆ͣ̚は」(一部の言語、特にタイは、実際に組み合わせ発音区別符号を使用するので、これは15歳のミームのためののちょうどのに有用ではないことに注意して考えるが、明らかにそれは)最も重要なユースケースです。 のそれはをUTF-8でエンコードされているとします。

:私たちはこの文字列の長さについて話すことができる3つの方法があります。

95バイト

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個のコードポイント

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つの書記素

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

ICU

を使用して長さを見つけます

がありICUのためのC ++のクラスがありますが、それらはUTF-16に変換する必要があります。あなたは、いくつかのUTF-8サポートを得るために、直接Cの型とマクロを使用することができます:

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

この印刷物ます:

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はラップ、そしてよりよいインタフェースを提供するかもしれません。しかし、それはまだUTF-16から/への変換を必要とします。

これは、文字列を入力する最も簡単な方法は、その長さを見つけるかもしれません。

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

}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top