int से char * में कैसे कन्वर्ट करें?


98

एकमात्र तरीका मुझे पता है:

#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
आप C ++ स्ट्रिंग के बजाय C-string क्यों चाहते हैं?
किलियांदस

1
उपयोग sprintf
Kasma

जवाबों:


128
  • C ++ 17 में, निम्नानुसार उपयोग करें std::to_chars:

    std::array<char, 10> str;
    std::to_chars(str.data(), str.data() + str.size(), 42);
  • C ++ 11 में, निम्नानुसार उपयोग करें std::to_string:

    std::string s = std::to_string(number);
    char const *pchar = s.c_str();  //use char const* as target type
  • और C ++ 03 में, आप जो कर रहे हैं वह ठीक है, केवल उपयोग के अलावा const:

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

1
पहला भाग वास्तव में इस सवाल का जवाब नहीं देता (हालाँकि यह अच्छी सहायक जानकारी है क्योंकि मुझे उस कार्य की जानकारी नहीं थी)
jcoder

1
बेहतर :) प्लस मैं बेहतर फिर से सी + + 11 के बारे में पढ़ता हूं। मुझे बड़ी विशेषताओं के बारे में पता है लेकिन इससे मुझे एहसास हुआ कि शायद और भी बहुत से लोग हैं जो मुझसे चूक गए हैं।
जॉकर

1
@ एडम्बियन: क्यों इसमें "std :: string" शामिल नहीं होना चाहिए? । std::stringइसके बजाय डिफ़ॉल्ट रूप से उपयोग करना चाहिए char*
नवाज

1
std :: string हमेशा उपलब्ध नहीं है, विशेष रूप से पुराने प्रोजेक्ट्स के लिए। C ++ के बहुत से खेल अभी भी std :: string से दूर रहते हैं। Int से std में जाना :: string to char * char के लिए int के समान नहीं है।
अदमियन

1
@ अदमबीन: यदि यह सी ++ है, तो मैं मान लेने वाला हूं std::string, डिफ़ॉल्ट रूप से उपलब्ध है, जब तक कि यह स्वयं प्रश्न में स्पष्ट रूप से निर्दिष्ट न हो। समझ में आता है? इसके अलावा, चूंकि प्रश्न स्वयं std::string(और std::stringstream) का उपयोग करता है , तो आपके पास इससे असहमत होने का बहुत कारण नहीं है।
नवाज

11

मुझे लगता है कि आप स्प्रिंट का उपयोग कर सकते हैं:

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

1
आपको चार * चर को बदलना चाहिए, अभी नंबरस्ट्रिंग पॉइंटर्स की एक सरणी है
josefx

1
साथ ही, आपको 32-बिट पूर्णांक को शून्य-समाप्त बेस -10 प्रतिनिधित्व में बदलने के लिए 12 वर्णों की आवश्यकता है। 10 के लिए पर्याप्त नहीं है -2147483647
स्टीव जेसोप

11
कुछ स्पष्टीकरण के बारे में कैसे? (((sizeof number) * CHAR_BIT) + 2)/3 + 2जादूगर की तरह दिखता है ...
माइक एस

7

आप बूस्ट का उपयोग कर सकते हैं

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

5

C- शैली समाधान का उपयोग करने के लिए किया जा सकता है itoa, लेकिन बेहतर तरीका यह है कि sprintf/snprintf का उपयोग करके स्ट्रिंग में इस संख्या को प्रिंट किया जाए । इस प्रश्न की जाँच करें: एक पूर्णांक को स्ट्रिंग में कैसे परिवर्तित करें?

ध्यान दें कि itoaफ़ंक्शन ANSI-C में परिभाषित नहीं है और C ++ का हिस्सा नहीं है, लेकिन कुछ संकलक द्वारा समर्थित है। यह एक गैर-मानक फ़ंक्शन है, इस प्रकार आपको इसका उपयोग करने से बचना चाहिए। इस प्रश्न को भी जांचें: स्ट्रिंग C ++ में पूर्णांक को परिवर्तित करने के लिए itoa () का विकल्प?

यह भी ध्यान दें कि C ++ में प्रोग्रामिंग करते समय C- स्टाइल कोड लिखना बुरा व्यवहार माना जाता है और कभी-कभी इसे "गस्टली स्टाइल" भी कहा जाता है। क्या आप वास्तव में इसे सी-स्टाइल 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

1
हाँ। c_str आपको स्ट्रिंग ऑब्जेक्ट के आंतरिक बफर के लिए एक संकेतक देता है। यदि आप कास्ट को दूर करते हैं तो आप या कोई अन्य प्रोग्रामर यह सोच सकता है कि नॉन-कॉन्स वैरिएबल के माध्यम से बफर को बदलना ठीक है। लेकिन यह नहीं है। मूल स्ट्रिंग ऑब्जेक्ट इन परिवर्तनों के बारे में कुछ भी नहीं जानता है। दूसरी ओर स्ट्रिंग अभी भी बफर का मालिक है। अगर स्ट्रिंग ऑब्जेक्ट स्कोप से बाहर चला जाता है तो पॉइंटर के पीछे की मेमोरी स्ट्रिंग ऑब्जेक्ट द्वारा नष्ट हो जाती है। कॉपी ऑपरेशन दोनों समस्याओं को दूर करता है।
user331471

1
वैकल्पिक रूप से, std::vector<char> temp_vec(temp_str.begin(), temp_str.end()); temp_vec.push_back(0); char *char_type = &vec[0];। यह आपको परिवर्तनशील स्मृति प्रदान करता है, हालांकि निश्चित रूप से आपको अभी भी वेक्टर को जीवित रखने की आवश्यकता है जब तक कि आप पॉइंटर का उपयोग करना चाहते हैं।
स्टीव जेसोप

1
या बस उपयोग करें stringऔर पुराने, सादे, char *पुराने सी से बेवकूफ सी के साथ परेशान न करें । फ्लेम सी <फ्लेम का
आशय

@Griwes: सवाल यह है कि कैसे प्राप्त करें char*, "क्या C ++ से किसी भी तरह की कॉलिंग मौजूदा लाइब्रेरी में लिखी गई है, या मुझे उन्हें C ++ में फिर से लागू करना चाहिए?" ; -पी
स्टीव जेसप

2

ठीक है .. सबसे पहले मुझे कुछ चाहिए था जो यह प्रश्न पूछ रहा था, लेकिन मुझे इसकी आवश्यकता थी! दुर्भाग्य से "बेहतर" तरीका लगभग 600 लाइनों का कोड है !!! इसका नाम क्षमा करें जो इसके साथ कुछ भी नहीं करता है जो यह कर रहा है। उचित नाम Integer64ToCharArray (int64_t मूल्य) था;

https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp

बिना किसी बाधा के प्रदर्शन को साफ करने के लिए बेझिझक कोशिश करें।

इनपुट: किसी भी हस्ताक्षरित 64 बिट मूल्य न्यूनतम से अधिकतम सीमा तक।

उदाहरण:

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

आउटपुट:

Test: 9223372036854775807
Test: -9223372036854775808

मूल गति परीक्षण: ( Integer64ToCharArray (); )

सबसे अच्छा मामला 1 अंक मूल्य।

लूप्स: 100,000,000, समय खर्च: 1,381 (मिल्ली), समय प्रति लूप 13 (नैनो)

बदतर मामला 20 अंकों का मूल्य।

लूप्स: 100,000,000, टाइम स्पेंट: 22,656 (मिल्ली), टाइम प्रति लूप 226 (नैनो)

नई डिज़ाइन स्पीड टेस्ट: ( AddDynamicallyToBuffer (); )

सबसे अच्छा मामला 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

यह थोड़ा देर हो सकता है, लेकिन मैं भी एक ही मुद्दा था। "चारकोन" पुस्तकालय के साथ सी + 17 में चार को बदलने को संबोधित किया गया था।

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


0

आप कास्टिंग का उपयोग भी कर सकते हैं।

उदाहरण:

string s;
int value = 3;
s.push_back((char)('0' + value));

2
क्या होगा यदि मूल्य नकारात्मक है या अंक नहीं है?
ज़िया ERKOC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.