কীভাবে ইনট থেকে চর * তে রূপান্তর করবেন?


99

আমি জানি একমাত্র উপায়:

#include <sstream>
#include <string.h>
using namespace std;

int main() {
  int number=33;
  stringstream strs;
  strs << number;
  string temp_str = strs.str();
  char* char_type = (char*) temp_str.c_str();
}

তবে কি টাইপিং কম আছে?


8
আপনি কেন সি ++ স্ট্রিংয়ের পরিবর্তে সি-স্ট্রিং চান?
কিলিয়ানডিএস

4
ব্যবহারের , sprintf
আশিস Kasma

উত্তর:


133
  • সি ++ 17 এ, ব্যবহার করুন std::to_chars:

    std::array<char, 10> str;
    std::to_chars(str.data(), str.data() + str.size(), 42);
    
  • সি ++ 11 এ, std::to_stringহিসাবে ব্যবহার করুন :

    std::string s = std::to_string(number);
    char const *pchar = s.c_str();  //use char const* as target type
    
  • এবং সি ++ 03 এ আপনি যা করছেন তা ঠিকঠাক, ব্যবহার ব্যতীত const:

    char const* pchar = temp_str.c_str(); //dont use cast
    

4
প্রথম অংশটি আসলে প্রশ্নের উত্তর দেয় না (যদিও আমি সেই ফাংশন সম্পর্কে অবগত ছিলাম না কেন এটি ভাল সহায়ক তথ্য)
jcoder

4
আরও ভাল :) প্লাস আমি আরও সি ​​++ 11 সম্পর্কে আরও পড়তে চাই। আমি বড় বৈশিষ্ট্যগুলি সম্পর্কে জানি কিন্তু এটি আমাকে বুঝতে পেরেছে যে সম্ভবত আরও ছোট কিছুগুলি আমি মিস করেছি।
jcoder

4
@ অ্যাডামিন: এটি "স্টাড :: স্ট্রিং" জড়িত করা উচিত নয় কেন? । এর std::stringপরিবর্তে ডিফল্টরূপে ব্যবহার করা উচিত char*
নওয়াজ

4
স্ট্যান্ড :: স্ট্রিং সবসময় পাওয়া যায় না, বিশেষত পুরানো প্রকল্পগুলিতে। প্রচুর সি ++ গেমস এখনও স্ট্যান্ড স্ট্রিং থেকে দূরে থাকে। ইন্টি থেকে স্টাড :: স্ট্রিং থেকে চর * তে যাওয়া ইন্ট টু চর * এর সমান নয়।
আদমবিয়ান

4
@ অ্যাডাবিন: যদি এটি সি ++ হয় তবে আমি ধরে নিচ্ছি যে std::stringএটি ডিফল্টরূপে উপলব্ধ রয়েছে, যদি না এটি প্রশ্নটিতে স্পষ্টভাবে নির্দিষ্ট না করা হয়। বোধ হয়? এছাড়াও, যেহেতু প্রশ্নটি নিজেই std::string(এবং std::stringstream) ব্যবহার করে , তাই আপনার সাথে এটির সাথে দ্বিমত পোষণ করার অনেক কারণ নেই।
নওয়াজ

12

আমি মনে করি আপনি একটি স্প্রিন্টফ ব্যবহার করতে পারেন:

int number = 33;
char* numberstring[(((sizeof number) * CHAR_BIT) + 2)/3 + 2];
sprintf(numberstring, "%d", number);

4
আপনার চরটি * চরকে পরিবর্তন করা উচিত, এখনই সংখ্যাসমূহটি পয়েন্টারের একটি অ্যারে
জোসেফএক্স

4
এছাড়াও, 32-বিট পূর্ণসংখ্যাকে নুল-টার্মিনেটেড বেস -10 উপস্থাপনায় রূপান্তর করতে আপনার 12 অক্ষর প্রয়োজন। 10 এর জন্য যথেষ্ট নয় -2147483647
স্টিভ জেসপ

12
কিছু ব্যাখ্যা সম্পর্কে? (((sizeof number) * CHAR_BIT) + 2)/3 + 2উইজার্ড্রির মতো দেখাচ্ছে ...
মাইক এস

7

আপনি বুস্ট ব্যবহার করতে পারেন

#include <boost/lexical_cast.hpp>
string s = boost::lexical_cast<string>( number );

5

সি-স্টাইলের সমাধানটি ব্যবহার করা যেতে পারে itoaতবে sprintf/ এরsnprintf সাহায্যে স্ট্রিংয়ে এই সংখ্যাটি মুদ্রণ করা আরও ভাল উপায় । এই প্রশ্নটি দেখুন: কীভাবে একটি পূর্ণসংখ্যাকে একটি স্ট্রিংয়ে বহনযোগ্য রূপান্তর করতে?

নোট করুন যে itoaফাংশনটি এএনএসআই-সি-তে সংজ্ঞায়িত নয় এবং এটি সি ++ এর অংশ নয়, তবে কয়েকটি সংকলক দ্বারা সমর্থিত। এটি একটি অ-মানক ফাংশন, সুতরাং আপনার এটি ব্যবহার করা এড়ানো উচিত। এই প্রশ্নটিও দেখুন: পূর্ণসংখ্যাকে স্ট্রিং C ++ এ রূপান্তর করার জন্য itoa () এর বিকল্প?

এছাড়াও নোট করুন যে সি ++ এ প্রোগ্রামিং করার সময় সি স্টাইল কোড লেখা খারাপ অভ্যাস হিসাবে বিবেচিত হয় এবং কখনও কখনও "ভয়াবহ স্টাইল" হিসাবে অভিহিত হয়। আপনি কি সত্যিই এটিকে সি-স্টাইলের char*স্ট্রিংয়ে রূপান্তর করতে চান ? :)


5

আমি শেষ লাইনে কনস্টকে টাইপকাস্ট করব না কারণ এটি কোনও কারণে রয়েছে। যদি আপনি কোন কনস্টের চরটি নিয়ে বেঁচে থাকতে না পারেন তবে আপনি আরও ভালভাবে চর অ্যারের অনুলিপি করুন:

char* char_type = new char[temp_str.length()];
strcpy(char_type, temp_str.c_str());

তুমি বোঝাতে const char* char_type = temp_str.c_str();চাও?
rsk82

4
হ্যাঁ. c_str স্ট্রিং অবজেক্টের অভ্যন্তরীণ বাফারকে আপনাকে একটি পয়েন্টার দেয়। যদি আপনি এই কনস্টিটকে ফেলে দেন তবে আপনি বা অন্য কোনও প্রোগ্রামার নন-কনস্টেবল ভেরিয়েবলের মাধ্যমে বাফারটি পরিবর্তন করা ঠিক বলে মনে করতে পারেন। তবে তা নয়। মূল স্ট্রিং অবজেক্ট এই পরিবর্তনগুলি সম্পর্কে কিছুই জানে না। অন্যদিকে স্ট্রিংটি এখনও বাফারের মালিক। যদি স্ট্রিং অবজেক্টটি সুযোগের বাইরে চলে যায় তবে পয়েন্টারের পিছনে থাকা মেমরিটি মুছে ফেলা হয় স্ট্রিং অবজেক্টস ডেস্ট্রাক্টর দ্বারা আপনাকে ঝুলন্ত পয়েন্টারটি রেখে। অনুলিপি অপারেশন উভয় সমস্যা মুছে ফেলে।
ব্যবহারকারী 331471

4
বিকল্পভাবে std::vector<char> temp_vec(temp_str.begin(), temp_str.end()); temp_vec.push_back(0); char *char_type = &vec[0];,। এটি আপনাকে পরিবর্তনীয় স্মৃতি দেয় যদিও অবশ্যই আপনি এখনও ভেক্টরটিকে যতক্ষণ পয়েন্টারটি ব্যবহার করতে চান তার জন্য বাঁচিয়ে রাখতে হবে।
স্টিভ জেসপ

4
অথবা শুধু ব্যবহার stringএবং নির্বোধ, পুরাতন সমভূমি সঙ্গে বিরক্ত করবেন না char *পুরাতন থেকে প্লেইন সি <শিখা বিট অভিপ্রেত>
Griwes

@ গ্রিউস: প্রশ্নটি কীভাবে পাবেন char*, না "কী সি ++ থেকে সিটিতে লেখা বিদ্যমান লাইব্রেরিতে ডাকার কোনও বিন্দু নেই, নাকি আমি সেগুলি সি ++ এ পুনরায় প্রয়োগ করব?" ;
স্টিভ


2

ঠিক আছে .. প্রথমত আমার এমন কিছু প্রয়োজন ছিল যা এই প্রশ্নটি যা জিজ্ঞাসা করেছিল তা করেছিল, তবে আমার এটি দ্রুত প্রয়োজন ছিল! দুর্ভাগ্যক্রমে "আরও ভাল" উপায়টি কোডের প্রায় 600 লাইনের !!! এটির নামটি ক্ষমা করুন যা এটি করছে তার সাথে কিছুই করার নেই। যথাযথ নামটি ছিল Integer64ToCharArray (int64_t মান);

https://github.com/JeremyDX/ All-Language-Testing-Code/blob/master/C%2B%2B%20 উদাহরণস্বরূপ / ইন্টেজারটোরচরআরেটেষ্টিংপ্প

পারফরম্যান্সকে বাধা না দিয়ে এই কোডটি সাফাই চেষ্টা করে নির্দ্বিধায় করুন।

ইনপুট: সর্বনিম্ন থেকে সর্বোচ্চ সীমা পর্যন্ত যে কোনও স্বাক্ষরিত bit৪ বিটের মান।

উদাহরণ:

std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MAX) << '\n';
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MIN) << '\n';

আউটপুট:

Test: 9223372036854775807
Test: -9223372036854775808

আসল গতির টেস্ট: ( পূর্ণসংখ্যার 64ToCharArray (); )

সেরা কেস 1 ডিজিটের মান।

লুপস: 100,000,000, সময় ব্যয়: 1,381 (মিলি), সময় প্রতি লুপ 13 (ন্যানো)

খারাপের 20 কেজি মান।

লুপস: 100,000,000, সময় ব্যয়: 22,656 (মিলি), সময় প্রতি লুপ 226 (ন্যানো

নতুন ডিজাইনের গতির টেস্ট: ( অ্যাডডিনামিকালি টুবফার (); )

সেরা কেস 1 ডিজিটের মান।

লুপস: 100,000,000, সময় ব্যয়: 427 (মিলি), সময় প্রতি লুপ 4 (ন্যানো)

32 বিট সবচেয়ে খারাপ কেস - 11 ডিজিটের মান।

লুপস: 100,000,000, সময় ব্যয়: 1,991 (মিলি), সময় প্রতি লুপ 19 (ন্যানো)

নেতিবাচক 1 ট্রিলিয়ন সবচেয়ে খারাপ কেস - 14 ডিজিটের মান।

লুপস: 100,000,000, সময় ব্যয়: 5,681 (মিলি), সময় প্রতি লুপ 56 (ন্যানো)

64 বিট খারাপের কেস - 20 ডিজিটের মান।

লুপস: 100,000,000, সময় ব্যয়: 13,148 (মিলি), সময় প্রতি লুপ 131 (ন্যানো)

কিভাবে এটা কাজ করে!

আমরা একটি বিভাজক এবং বিজয়ী কৌশলটি সম্পাদন করি এবং একবার আমরা এখন স্ট্রিংয়ের সর্বোচ্চ দৈর্ঘ্যকে স্বতন্ত্রভাবে প্রতিটি চরিত্রের মান সেট করি। উপরের গতির পরীক্ষায় দেখানো হয়েছে যে বৃহত্তর দৈর্ঘ্য বড় কর্মক্ষমতা জরিমানা লাভ করে, তবে এটি এখনও অনেক দ্রুত তবে মূল লুপ পদ্ধতি এবং কোনও কোড আসলে অন্য দুটি পদ্ধতির মধ্যে পরিবর্তিত হয়নি তবে লুপিং এর আর ব্যবহার নেই।

আমার ব্যবহারের জন্য নামটি পরিবর্তে আমি অফসেটটি ফিরিয়ে দেব এবং আমি চর অ্যারেগুলির একটি বাফার সম্পাদনা করি না বরং আমি ভার্টেক্স ডেটা আপডেট করতে শুরু করি এবং ফাংশনে অফসেটের জন্য অতিরিক্ত প্যারামিটার থাকে যাতে এটি -1 এ আরম্ভ হয় না।


1

এটি কিছুটা দেরি হতে পারে তবে আমারও একই সমস্যা ছিল। চরে রূপান্তরিত করার বিষয়টি C ++ 17 এ "চরকনভ" লাইব্রেরির মাধ্যমে সম্বোধন করা হয়েছিল।

https://en.cppreferences.com/w/cpp/utility/to_chars



0

আমাদের পূর্ণসংখ্যার মানটি স্টাড :: স্ট্রিংয়ে রূপান্তর করা যাতে আমরা জানতে পারি যে কত দিন (কত সংখ্যার অঙ্ক)।

তারপরে আমরা স্ট্রিং লেটারের আকারের আকারের অ্যারে দৈর্ঘ্য তৈরি করবো, সুতরাং আমরা আমাদের মানটিকে স্ট্রিংয়ের পরে চার অ্যারে অনুলিপি করতে পারি।

#include <string>

char* intToStr(int data) {
    std::string strData = std::to_string(data);

    char* temp = new char[strData.length() + 1];
    strcpy(temp, strData.c_str());

   return temp;
}

4
দয়া করে উত্তর হিসাবে কেবল কাঁচা কোড পোস্ট করবেন না। কোডটি কী করে এবং কেন তা সর্বদা ব্যাখ্যা করুন।
কোডসামুরাই 777

আরে, উত্তরের জন্য ধন্যবাদ! আপনি কিছুটা ব্যাখ্যা দিতে পারেন? এটি ওপি এবং ভবিষ্যতের পাঠকদের সহায়তা করবে :)
x শিরাজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.