c++ - রজন - সি ভাষার বৈশিষ্ট্য




কিভাবে সি++ মধ্যে স্মৃতি ব্যবহার করবেন? (3)

একক উদ্ধৃতি ব্যবহার করার সময় ত্রুটি 'টি' এটি অতিরিক্ত অক্ষর প্রিন্ট করে।

কারণ আপনি নাল টারমিনেটর overwrote।

টারমিনেটর অ্যারের আকারের অংশ (একটি অ্যারে যাদু নয়), যদিও এটি লজিক্যাল স্ট্রিং আকারের অংশ নয় ।

সুতরাং, আমি মনে করি আপনি বোঝাতে চেয়েছিলেন:

memset(str, 't', strlen(str));
//               ^^^^^^

ডবল উদ্ধৃতি দিয়ে "টি" ব্যবহার করার সময় ত্রুটি

সম্পূর্ণ ভিন্ন জিনিস। আপনি একটি স্ট্রিং স্ট্রিং প্রতিটি অক্ষর সেট করতে কম্পিউটার বলা। জ্ঞান করে না; কম্পাইল হবে না।

কিভাবে সি ++ মধ্যে স্মৃতি ব্যবহার করবেন?

না।

std::fill std::begin এবং std::end সাথে একত্রে টাইপ-নিরাপদ std::fill ব্যবহার করুন।

std::fill(std::begin(str), std::end(str)-1, 't');

(যদি আপনি কর্মক্ষমতা সম্পর্কে চিন্তিত হন তবে তা হবেন না: এটি কেবল টেমপ্লেট বিশেষজ্ঞকরণ, অপ্টিমাইজেশান প্রয়োজন নেই, এটি টাইপ-নিরাপত্তা উত্সর্গ ছাড়াই যেখানে সম্ভব সম্ভব memset প্রতিনিধিত্ব করবে; উদাহরণস্বরূপ এখানে libstdc ++ ।)

অথবা শুধু একটি std::string সঙ্গে শুরু। 😊

আমি https://www.geeksforgeeks.org/memset-in-cpp/ থেকে সি ++ এ নিখরচায় মেমসেট শিখছি যেখানে উদাহরণটি নীচে দেওয়া হয়েছে

র্যান্ডম ওয়েবসাইট থেকে সি ++ শিখতে চেষ্টা করবেন না। পরিবর্তে নিজের একটি ভাল বই পান।

আমি পাইথন পটভূমি থেকে এবং সম্প্রতি সি ++ শেখার। আমি একটি সি / সি ++ ফাংশন শিখেছি যা memset বলা হয় এবং ওয়েবসাইটের https://www.geeksforgeeks.org/memset-in-cpp/ থেকে অনলাইন উদাহরণ অনুসরণ করে যেখানে আমি কিছু সংকলন ত্রুটি পেয়েছি:

/**
 * @author      : Bhishan Poudel
 * @file        : a02_memset_geeks.cpp
 * @created     : Wednesday Jun 05, 2019 11:07:03 EDT
 * 
 * Ref: 
 */

#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

int main(int argc, char *argv[]){
    char str[] = "geeksforgeeks";

    //memset(str, "t", sizeof(str));
    memset(str, 't', sizeof(str));

    cout << str << endl;

    return 0;
}

একক উদ্ধৃতি ব্যবহার করার সময় ত্রুটি 'টি'
এই অতিরিক্ত অক্ষর প্রিন্ট।

tttttttttttttt![email protected]`

ডবল উদ্ধৃতি দিয়ে "টি" ব্যবহার করার সময় ত্রুটি

$ g++ -std=c++11 a02_memset_geeks.cpp 
a02_memset_geeks.cpp:17:5: error: no matching function for call to 'memset'
    memset(str, "t", sizeof(str));
    ^~~~~~
/usr/include/string.h:74:7: note: candidate function not viable: no known
      conversion from 'const char [2]' to 'int' for 2nd argument
void    *memset(void *, int, size_t);
         ^
1 error generated.

কিভাবে সি ++ মধ্যে স্মৃতি ব্যবহার করবেন?

আরও অধ্যয়ন
memset ত্রুটিগুলির সাথে চমৎকার টিউটোরিয়াল এখানে দেওয়া হয়েছে: https://web.archive.org/web/20170702122030/https:/augias.org/paercebal/tech_doc/doc.en/cp.memset_is_evil.html


এই ঘোষণা

char str[] = "geeksforgeeks";

একটি অক্ষর অ্যারে ঘোষণা করে যার মধ্যে একটি স্ট্রিং রয়েছে যা শূন্য চিহ্ন '\0' সহ শব্দের ক্রম।

আপনি নিম্নলিখিত সমতুল্য ঘোষণা ঘোষণা করতে পারেন

char str[] = 
{ 
    'g', 'e', 'e', 'k', 's', 'f', 'o', 'r', 'g', 'e', 'e', 'k', 's', '\0'
};

ফাংশন memset এই কল

memset(str, 't', sizeof(str));

শূন্য শূন্য সহ অ্যারের সমস্ত অক্ষর ওভাররাইড করে।

তাই পরবর্তী বিবৃতি

cout << str << endl;

অনির্ধারিত আচরণ ফলাফল কারণ এটি সমাপ্তির শূন্য সম্মুখীন হওয়া পর্যন্ত অক্ষর outpuuts।

আপনি পরিবর্তে লিখতে পারে

#include <iostream>
#include <cstring>

int main()
{
    char str[] = "geeksforgeeks";

    std::memset( str, 't', sizeof( str ) - 1 );

    std::cout << str << '\n';
}

অথবা নিম্নলিখিত উপায়

#include <iostream>
#include <cstring>

int main()
{
    char str[] = "geeksforgeeks";

    std::memset( str, 't', std::strlen( str ) );

    std::cout << str << '\n';
}

যে অ্যারের মধ্যে শূন্য শূন্যস্থান অপরিবর্তিত রাখা হয়।

যদি আপনি শূন্য শূন্য সহ অ্যারের সমস্ত অক্ষর ওভাররাইড করতে চান তবে আপনার এই বিবৃতিটি প্রতিস্থাপন করা উচিত

std::cout << str << '\n';

এই বিবৃতির জন্য

std::cout.write( str, sizeof( str ) ) << '\n';

এটি নীচের প্রোগ্রামে দেখানো হয়েছে কারণ অ্যারেরটিতে এখন একটি স্ট্রিং নেই।

#include <iostream>
#include <cstring>

int main()
{
    char str[] = "geeksforgeeks";

    std::memset( str, 't', sizeof( str ) );

    std::cout.write( str, sizeof( str ) ) << '\n';
}

এই কল জন্য

memset(str, "t", sizeof(str));

তারপরে দ্বিতীয় আর্গুমেন্টের ধরন (যেটি টাইপ const char * ) টাইপ int এর দ্বিতীয় ফাংশন পরামিতির ধরন অনুসারে নয়। ফাংশন ঘোষণা দেখুন

void * memset ( void * ptr, int value, size_t num );

সুতরাং কম্পাইলার একটি ত্রুটি বার্তা সমস্যা।

চরিত্র অ্যারের পাশাপাশি (যেগুলি সি ++ তেও প্রায়শই ব্যবহৃত হয়) আপনি স্ট্রিংগুলিকে সিমুলেশন করে এমন স্ট্যান্ডার্ড ক্লাস std::basic_string std::string (বা std::basic_string std::string ) ব্যবহার করতে পারেন।

এই ক্ষেত্রে একটি অক্ষর দিয়ে একটি স্ট্রিং পূরণ করতে আদর্শ সি ফাংশন মেসেট ব্যবহার করার প্রয়োজন নেই। এই কাজ করার সবচেয়ে সহজ উপায় নিম্নলিখিত

#include <iostream>
#include <string>

int main()
{
    std::string s( "geeksforgeeks" );

    s.assign( s.length(), 't' );

    std::cout << s << '\n';
}

আরেকটি উপায়ে স্ট্যান্ডার্ড অ্যালগরিদম std::fill বা std::fill_n শিরোনাম <algorithm> ঘোষণা করা হয়েছে। উদাহরণ স্বরূপ

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

int main()
{
    std::string s( "geeksforgeeks" );

    std::fill( std::begin( s ), std::end( s ), 't' );

    std::cout << s << '\n';
}

অথবা

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

int main()
{
    std::string s( "geeksforgeeks" );

    std::fill_n( std::begin( s ), s.length(), 't' );

    std::cout << s << '\n';
}

আপনি std::string নিম্নোক্ত পদ্ধতিগুলির একটিতে replace পদ্ধতিটি ব্যবহার করতে পারেন

#include <iostream>
#include <string>

int main()
{
    std::string s( "geeksforgeeks" );

    s.replace( 0, s.length(), s.length(), 't' );

    std::cout << s << '\n';
}

অথবা

#include <iostream>
#include <string>

int main()
{
    std::string s( "geeksforgeeks" );

    s.replace( std::begin( s ), std::end( s ), s.length(), 't' );

    std::cout << s << '\n';
}

ভ্লাদ আপনার প্রশ্নটির প্রথম অংশটি সাবধানে উত্তর দিয়েছেন, কিন্তু আমি মনে করি দ্বিতীয় অংশটি আরও স্বচ্ছতার সাথে ব্যাখ্যা করা যেতে পারে:

অন্যরা যেমন উল্লেখ করেছেন, 't' একটি চরিত্র, তবে "t" একটি স্ট্রিং এবং স্ট্রিংগুলির শেষে শেষে একটি অসীম টার্মিনেটর রয়েছে। এটি "t" একটি অ্যারের নয় বরং দুটি অক্ষর করে তোলে - ['t', '\0'] ! এটি স্মৃতির ত্রুটির আরও স্বজ্ঞাত করে তোলে - এটি সহজেই যথেষ্ট একটি int তে একটি একক char int পারে, কিন্তু যখন এটি char এর একটি অ্যারে দেওয়া হয় তখন এটি chokes। পাইথন ঠিক মত, int(['t', '\0']) (অথবা ord(['t', '\0']) ) গণনা করে না।





memset