मुख्य पात्रों से परिचय: std::string और पुराना दोस्त char*
\n\nकल्पना करें: आप C++ में कोड लिख रहे हैं, और अचानक आपको पुरानी C लाइब्रेरी में टेक्स्ट भेजना है जो const char* माँगती है। या फिर आप ऐसा फंक्शन इस्तेमाल करना चाहते हैं जो स्ट्रिंग को "जगह पर" बदलता है char* के ज़रिए। आपके पास आधुनिक, आसान std::string है। तो सवाल उठता है: "std::string को const char* या char* में कैसे बदलें?"।
यह सवाल Stack Overflow पर शुरुआती C++ डेवलपर्स के बीच सबसे लोकप्रिय है। और सही भी है: स्ट्रिंग और पॉइंटर्स को न समझना मेमोरी लीक, प्रोग्राम क्रैश और अजीब बग्स का कारण बन सकता है। लेकिन डरें नहीं! अब हम सब कुछ सरलता से समझेंगे।
\n\nइस लेख में आप जानेंगे:
\n- \n
std::stringसेconst char*सुरक्षित रूप से कैसे प्राप्त करें। \n - मॉडिफ़ाय करने योग्य
char*कैसे प्राप्त करें और कब इसकी ज़रूरत है। \n - शुरुआती लोगों के लिए कौन से खतरे हैं। \n
- C++ स्ट्रिंग कन्वर्जन में सामान्य गलतियों से कैसे बचें। \n
c_str() मेथड: आपका मुख्य सहायक
\n\nconst char* प्राप्त करने का सबसे आसान और सुरक्षित तरीका है std::string ऑब्जेक्ट पर c_str() मेथड को कॉल करना। इसे ऐसा क्यों कहा जाता है? क्योंकि यह C-style string (null-terminated string) लौटाता है।
#include <iostream>\n#include <string>\n\nint main() {\n std::string message = "नमस्ते, C++ की दुनिया!";\n const char* c_message = message.c_str();\n \n std::cout << c_message << std::endl;\n return 0;\n}\n\nc_str() मेथड गारंटी देता है कि लौटाया गया कैरेक्टर ऐरे null कैरेक्टर ('\\0') पर खत्म होता है। यह सभी C फंक्शन्स के लिए ज़रूरी है जो स्ट्रिंग के साथ काम करते हैं (जैसे strlen, fopen, printf)।
महत्वपूर्ण चेतावनी: स्ट्रिंग का जीवनकाल
\n\nc_str() से मिला पॉइंटर std::string के आंतरिक बफर को इंगित करता है। जैसे ही मूल स्ट्रिंग बदली या नष्ट की जाती है, यह पॉइंटर अमान्य हो जाता है। इसे कभी "बाद के लिए" सेव न करें!
std::string* get_string() {\n return new std::string("अस्थायी डेटा");\n}\n\nint main() {\n const char* bad_ptr = get_string()->c_str();\n delete get_string(); // bad_ptr अब हैंग हो गया!\n // bad_ptr का उपयोग करना अब खतरनाक है — यह अनिर्धारित व्यवहार है\n}\n\ndata() मेथड: लगभग वैसा ही, लेकिन एक अंतर है
\n\nC++11 से पहले, data() मेथड const char* लौटाता था, लेकिन null-termination की गारंटी नहीं थी। C++11 मानक से शुरू करके, data() और c_str() समान रूप से काम करते हैं — दोनों null-terminated स्ट्रिंग लौटाते हैं। हालांकि, पिछली संगतता और कोड की स्पष्टता के लिए, जब आपको C-स्ट्रिंग चाहिए तो c_str() का उपयोग करने की सलाह दी जाती है।
std::string text = "C++11 और नया";\nconst char* ptr1 = text.c_str(); // स्पष्ट: C-स्ट्रिंग चाहिए\nconst char* ptr2 = text.data(); // काम करता है, लेकिन कम स्पष्ट\n\nयदि आप पुराने मानकों (C++11 से पहले) पर कोड लिख रहे हैं, तो सुरक्षित स्ट्रिंग कन्वर्जन के लिए केवल c_str() का उपयोग करें।
सामान्य char* कैसे प्राप्त करें (const नहीं)?
\n\nकभी-कभी मॉडिफ़ाय करने योग्य char* पॉइंटर की ज़रूरत होती है। उदाहरण के लिए, आप कोई C फंक्शन कॉल कर रहे हैं जो स्ट्रिंग को बदलता है: strtok(), sprintf() या कोई पुरानी फ़ाइल लाइब्रेरी। std::string से सीधे char* "निकालने" का कोई तरीका नहीं है — और यह जानबूझकर किया गया है, ताकि आपको गलतियों से बचाया जा सके।
लेकिन एक रास्ता है: स्ट्रिंग की सामग्री को एक नए ऐरे में कॉपी करें।
\n\n#include <iostream>\n#include <string>\n#include <cstring>\n\nint main() {\n std::string text = "बदलने योग्य डेटा";\n char* mutable_ptr = new char[text.size() + 1];\n std::strcpy(mutable_ptr, text.c_str());\n \n // अब mutable_ptr को बदला जा सकता है\n mutable_ptr[0] = 'm';\n \n std::cout << mutable_ptr << std::endl;\n \n delete[] mutable_ptr; // मेमोरी खाली करना न भूलें!\n return 0;\n}\n\nयाद रखें: new[] से मेमोरी लेने पर delete[] से उसे खाली करना ज़रूरी है।