স্টাডি :: স্ট্রিংয়ে অক্ষরের সংখ্যা কীভাবে পাবেন?


112

আমি কীভাবে সি ++ তে স্ট্রিংয়ের অক্ষরের সংখ্যা পেতে পারি?


1
আপনি কোন ধরণের স্ট্রিং নিয়ে কাজ করছেন? এসটিডি :: স্ট্রিং? cstring? নাল টার্মিনেটেড স্ট্রিং?
স্টিভ রোয়ে

সর্বাধিক বোকা-প্রমাণ উপায় হ'ল এটি লুপ করার জন্য এবং চরিত্রগুলি নিজেই গণনা করা।
ক্রিথিক

উত্তর:


177

আপনি যদি একটি ব্যবহার করেন std::string, কল করুন length():

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

আপনি যদি সি-স্ট্রিং ব্যবহার করছেন তবে কল করুন strlen()

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

অথবা, যদি আপনি পাস্কাল-স্টাইলের স্ট্রিংগুলি ব্যবহার করতে পছন্দ করেন (বা চ ***** স্ট্রিং যেমন জোয়েল স্পলস্কি যখন তাদের পিছনে নূলে রয়েছে তখন তাদের কল করতে পছন্দ করে ), কেবল প্রথম চরিত্রটিকেই অবলম্বন করুন।

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

7
তাদের সঠিক মনের মধ্যে কে পাস্কাল স্টাইলের স্ট্রিং ব্যবহার করবে?
এক্সার্ন

17
দৈর্ঘ্য () বাইটের সংখ্যা ফেরায় না, অক্ষরের সংখ্যা নয়?

2
স্টাডি :: স্ট্রিংয়ের জন্য, এটি একই জিনিস (আপনি যদি কোনও ভেরিয়েবল দৈর্ঘ্যের এনকোডিং সংরক্ষণ না করে, বা মাল্টি-বাইট অক্ষর সংরক্ষণ করার জন্য একটি std :: স্ট্রিং ব্যবহার না করেন)। যদি আপনি এটি করছেন, আপনি স্ট্যান্ডের লাইব্রেরি থেকে কোনও কিছুর সাথে খুব বেশি সহায়তা পাচ্ছেন না, তাই আপনি নিজের স্ট্রেনের রোলিংও পরিচালনা করতে পারেন। Wstring, u16string এবং u32string এর জন্য এটি বাইটের পরিবর্তে অক্ষরের সংখ্যা প্রদান করে। (আবারও এই প্রোভিসো সহ যে আপনি যদি এর মধ্যে যে কোনও একটিতে চলক-দৈর্ঘ্যের এনকোডিং ব্যবহার করছেন তবে আপনাকে নিজের স্ট্রেন রোল করতে হবে)।
অন্ধকার

4
এটা তোলে এই অত্যন্ত বিপরিতে উত্তর মান যোগ রিটার্ন টাইপ উল্লেখ করতে হবে: std::size_t
chux - মনিকা পুনরায় ইনস্টল করুন

3
এফ স্ট্রিংয়ের
১наđошƒаӽ

23

সি ++ স্ট্রিং (স্ট্যান্ড :: স্ট্রিং) এর সাথে ডিল করার সময় আপনি দৈর্ঘ্য () বা আকার () খুঁজছেন । উভয়েরই আপনাকে একই মান সরবরাহ করা উচিত। তবে সি-স্টাইল স্ট্রিংগুলির সাথে কাজ করার সময় আপনি স্ট্রেন () ব্যবহার করবেন ।

#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

5
নোট করুন যে আপনি অবহিত # অন্তর্ভুক্ত <স্ট্রিং।> এর পরিবর্তে # অন্তর্ভুক্ত <cstring> ব্যবহার করে সংকলক সতর্কতাগুলি (নির্দিষ্ট সি ++ সংকলকগুলিতে) এড়াতে পারবেন
কলিন

1
আপনার উদাহরণগুলি কেবল ASCII ব্যবহার করে। আপনি কি ইউনিকোড অক্ষরের জন্য এটি আপডেট করার আপত্তি করতে চান? বিশেষত 32 বিট যেমন 𝄞
টমাস ওয়েলারের

17

আপনি কোন স্ট্রিংয়ের বিষয়ে কথা বলছেন তা নির্ভর করে। বিভিন্ন ধরণের স্ট্রিং রয়েছে:

  1. const char* - একটি সি স্টাইলের মাল্টিবাইট স্ট্রিং
  2. const wchar_t* - একটি সি স্টাইলের প্রশস্ত স্ট্রিং
  3. std::string - একটি "স্ট্যান্ডার্ড" মাল্টিবাইট স্ট্রিং
  4. std::wstring - একটি "স্ট্যান্ডার্ড" প্রশস্ত স্ট্রিং

3 এবং 4 এর জন্য, আপনি ব্যবহার করতে পারেন .size()বা .length()পদ্ধতিগুলি।

1 এর জন্য, আপনি ব্যবহার করতে পারেন strlen()তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে স্ট্রিং ভেরিয়েবল নাল নয় (=== 0)

2 এর জন্য, আপনি ব্যবহার করতে পারেন wcslen()তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে স্ট্রিং ভেরিয়েবল নাল নয় (=== 0)

অন্যান্য স্ট্রিং ধরণের অ-মানক সি ++ লাইব্রেরিতে রয়েছে যেমন এমএফসি এর CString, এটিএল CComBSTR, এসি ACE_CString, এবং এর মতো পদ্ধতিগুলির সাথে .GetLength()। আমি তাদের মাথার উপরের দিকের সমস্ত কিছু নির্দিষ্ট করে মনে করতে পারি না।

STLSoft লাইব্রেরি এই কি তারা কল সব আউট আনমনা আছে স্ট্রিং এক্সেস শিম্স , যা কোনো ধরনের থেকে স্ট্রিং দৈর্ঘ্য (এবং অন্যান্য দিক) পেতে ব্যবহার করা যাবে। সুতরাং উপরে (অ-মানক গ্রন্থাগার বেশী সহ) একই ফাংশন ব্যবহার করে সকলের জন্য stlsoft::c_str_len()এই নিবন্ধটি কীভাবে এটি সমস্ত কাজ করে তা বর্ণনা করে, কারণ এটি সমস্ত সম্পূর্ণ সুস্পষ্ট বা সহজ নয়।


1
কোনটি 32 বিট চরিত্রের জন্য উপযুক্ত যেমন 𝄞?
টমাস ওয়েলারের

4

ইউনিকোডের জন্য

এখানে বেশ কয়েকটি উত্তর সম্বোধন করেছে যা .length()মাল্টবাইট চরিত্রগুলির সাথে ভুল ফলাফল দেয়, তবে 11 টি উত্তর রয়েছে এবং এর কোনওটিরই সমাধান দেওয়া হয়নি।

Z͉̳̺ͥͬ̾a̴͕̲̒̒͌̋ͪl̨͎̰̘͉̟ͤ̀̈̚͜g͕͔̤͖̟̒͝ͅo̵̡̡̼͚̐ͯ̅ͪ̆ͣ̚ এর ক্ষেত্রে

প্রথমত, আপনার "দৈর্ঘ্য" বলতে কী বোঝায় তা জানা গুরুত্বপূর্ণ। একটি অনুপ্রেরণাকারী উদাহরণের জন্য, "Z͉̳̺ͥͬ̾a̴͕̲̒̒͌̋ͪl̨͎̰̘͉̟ͤ̀̈̚͜g͕͔̤͖̟̒͝ͅo̵̡̡̼͚̐ͯ̅ͪ̆ͣ̚" স্ট্রিংটি বিবেচনা করুন (লক্ষ্য করুন যে কয়েকটি ভাষায়, বিশেষত থাই প্রকৃতপক্ষে ডায়াক্রিটিকাল চিহ্নগুলির সংমিশ্রণ ব্যবহার করে, সুতরাং এটি কেবল 15 বছরের পুরানো মেমসের জন্য কার্যকর নয়, তবে সম্ভবত এটি সবচেয়ে গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্রে) । ধরুন এটি ইউটিএফ -8 এ এনকোড হয়েছে । এই স্ট্রিংয়ের দৈর্ঘ্য সম্পর্কে আমরা তিনটি উপায় বলতে পারি:

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

আইসিইউ ব্যবহার করে দৈর্ঘ্য সন্ধান করা

আইসিইউর জন্য সি ++ ক্লাস রয়েছে তবে তাদের ইউটিএফ -16 এ রূপান্তর করা প্রয়োজন। কিছু ইউটিএফ -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

বুস্ট.লোকালে আইসিইউতে মোড়ক দেয় এবং এটি একটি সুন্দর ইন্টারফেস সরবরাহ করতে পারে। তবে এটি এখনও ইউটিএফ -16 এ / থেকে রূপান্তর প্রয়োজন।


3

আপনি যদি নতুন, এসটিএল-স্টাইলের স্ট্রিংগুলির পরিবর্তে পুরানো, সি-স্টাইলের স্ট্রিং ব্যবহার strlenকরেন তবে সি রান টাইম লাইব্রেরিতে ফাংশনটি রয়েছে:

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

3

আপনি যদি std :: স্ট্রিং ব্যবহার করছেন তবে এর জন্য দুটি সাধারণ পদ্ধতি রয়েছে:

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

আপনি যদি সি স্টাইলের স্ট্রিং ব্যবহার করছেন (চর * বা কনস্ট চর * ব্যবহার করছেন) তবে আপনি ব্যবহার করতে পারেন:

const char *pStr = "Some String";
size_t Size = strlen(pStr);

2
string foo;
... foo.length() ...

। দৈর্ঘ্য এবং। সাইজ সমার্থক, আমি কেবল "দৈর্ঘ্য" একটি সামান্য পরিষ্কার শব্দ মনে করি।


আকার () নিরুৎসাহিত করা হয়েছে কারণ আমি শুনেছি মনে আছে যে কয়েকটি বাস্তবায়নে এটি "দৈর্ঘ্য () + 1" ফিরিয়ে দেবে (কারণ এতে নাল টার্মিনেটর অন্তর্ভুক্ত রয়েছে)। সুতরাং এটি দৈর্ঘ্য () ব্যবহার করুন কারণ এটি পরিষ্কার এবং আরও বহনযোগ্য।

1
@ লাউকুয়েট, আপনি যদি কোনও মান-সম্মতিমূলক সংকলক বা এসটিএল বাস্তবায়ন ব্যবহার না করেন তবে আপনার আরও উদ্বেগের বিষয় থাকতে হবে।
স্ট্র্যাজার

2
@ নেলসন যে স্ট্যান্ডার্ড সি ++ স্ট্রিংয়ের মতো হওয়া উচিত নয় তা বাতিল-সমাপ্ত নয়। তবে সি_স্ট্রি () দিয়ে কাস্ট করার সময় এটি নাল বাইটটি শেষ পর্যন্ত যুক্ত করবে।
জন টি



2

সি ++ এসটিডি :: তে স্ট্রিংয়ের দৈর্ঘ্য () এবং আকার () পদ্ধতি আপনাকে বাইটের সংখ্যা দেয় এবং অগত্যা অক্ষরের সংখ্যাও দেয় না! সি-স্টাইল আকারের () ফাংশনের সাথে একই!

মুদ্রণযোগ্য 7 বিট-এএসসিআইআই অক্ষরের বেশিরভাগের জন্য এটি একই মান, তবে যে অক্ষরগুলি 7 বিট-এএসসিআইআই নয় এটি অবশ্যই তা নয়। আপনাকে প্রকৃত ফলাফল দেওয়ার জন্য নিম্নলিখিত উদাহরণটি দেখুন (bit৪ বিট লিনাক্স)।

এমন কোনও সাধারণ সি / সি ++ ফাংশন নেই যা সত্যই অক্ষরের সংখ্যা গণনা করতে পারে। যাইহোক, এই সমস্ত জিনিস বাস্তবায়ন নির্ভরশীল এবং অন্যান্য পরিবেশে পৃথক হতে পারে (সংকলক, 16/32 জিতে, লিনাক্স, এমবেডেড, ...)

নিম্নলিখিত উদাহরণ দেখুন:

#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

0

কোনও স্ট্রিং ইনপুট করা এবং এর দৈর্ঘ্য সন্ধান করা এটি সহজতম উপায় হতে পারে।

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

}

4
আপনি কী ভাবেন যে গণনা (স্ট্রিং) সেই স্ট্রিংকে :: দৈর্ঘ্য () দেয় না? অকারণে স্ট্রিংয়ের একটি অতিরিক্ত অনুলিপি তৈরি করা, এবং স্ট্রিংয়ে 2 বিলিয়ন অক্ষরের বেশি থাকলে একটি নেতিবাচক মান ফেরত দেওয়া।
23-28

0

স্ট্যান্ড নেমস্পেস সম্পর্কে বিরক্ত না করে স্ট্রিংয়ের দৈর্ঘ্য পাওয়ার সহজ উপায় নীচে রয়েছে

স্পেস সহ / ছাড়াই স্ট্রিং

#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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.