سؤال

كيف يمكنني الحصول على عدد الأحرف في سلسلة في C ++؟

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم std::string, ، يتصل length():

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"

أو، إذا كنت ترغب في استخدام سلاسل أسلوب Pascal (أو F ***** Strings مثل Joel Spolsky يحب الاتصال بهم عندما يكون لديهم فارغة خالية)، فقط dereference الحرف الأول.

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

نصائح أخرى

عند التعامل مع سلاسل C ++ (STD :: String)، كنت تبحث عن الطول() أو بحجم(). وبعد كلاهما يجب أن يوفر لك نفس القيمة. ومع ذلك عند التعامل مع سلاسل أسلوب 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-Style Multibyte
  2. const wchar_t* - سلسلة واسعة نمط C
  3. std::string - سلسلة "قياسية" متعددة بايت
  4. std::wstring - سلسلة واسعة "قياسية"

لمدة 3 و 4، يمكنك استخدام .size() أو .length() طرق.

لمدة 1، يمكنك استخدام strlen(), ، ولكن يجب عليك التأكد من أن متغير السلسلة غير فارغ (=== 0)

لمدة 2، يمكنك استخدام wcslen(), ، ولكن يجب عليك التأكد من أن متغير السلسلة غير فارغ (=== 0)

هناك أنواع سلسلة أخرى في مكتبات C ++ غير القياسية، مثل MFC CString, ، ATL's CComBSTR, ، الآس ACE_CString, وهلم جرا، مع طرق مثل .GetLength(), ، وما إلى ذلك وهلم جرا. لا أستطيع تذكر تفاصيلهم على حق قبالة رأسي.

ال stlsoft. وقد استخراج المكتبات هذا كل شيء مع ما يسمونه سلسلة الوصول الحشوات, ، والتي يمكن استخدامها للحصول على طول السلسلة (وغيرها من الجوانب) من أي نوع. لذلك لكل ما سبق (بما في ذلك مكتبة غير قياسية) باستخدام نفس الوظيفة stlsoft::c_str_len(). هذه المقالة يصف كيف يعمل كل شيء، لأنه ليس واضحا تماما أو سهل تماما.

إذا كنت تستخدم سلسلة Style القديمة، بدلا من الأوتار الأحدث والسلاسل STL، فهناك strlen وظيفة في مكتبة وقت التشغيل C:

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

إذا كنت تستخدم STD :: String، فهناك طرق شائعة لذلك:

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

إذا كنت تستخدم سلسلة نمط C (باستخدام Char * أو Conster Char *)، فيمكنك استخدام:

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

. طول و. الحجم مرادف، أعتقد أن "الطول" هو كلمة أكثر وضوحا قليلا.

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

لكائن السلسلة الفعلية:

yourstring.length();

أو

yourstring.size();

في C ++ STD :: سلسلة الطريقة () والحجم () تمنحك عدد البايتات، وليس بالضرورة عدد الشخصيات! نفسه مع وظيفة Sizeof Style C ()!

بالنسبة لمعظم أحرف 7BIT-ASCII القابلة للطباعة، هذه هي نفس القيمة، ولكن بالنسبة للأحرف التي ليست 7bit-ASCII، فهي بالتأكيد لا. انظر المثال التالي لإعطائك نتائج حقيقية (64bit Linux).

لا توجد وظيفة C / C ++ بسيطة يمكنها حساب عدد الأحرف حقا. بالمناسبة، كل هذه الأشياء تعتمد على التنفيذ وقد تكون مختلفة عن البيئات الأخرى (التحويل البرمجي، وين 16/32، Linux، Embedded، ...)

انظر المثال التالي:

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

ل unicode.

العديد من الإجابات هنا قد تناولت ذلك .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 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 كرسميم

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

العثور على أطوال باستخدام المحكمة العامة

هناك فصول C ++ ل ICU، لكنها تتطلب تحويلها إلى UTF-16. يمكنك استخدام أنواع C وحدات الماكرو مباشرة للحصول على بعض دعم 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̵̡̡̼͚̐ͯ̅ͪ̆ͣ̚");
}

هذه المطبوعات:

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