परिचय: स्ट्रिंग ट्रिम करना हर C++ डेवलपर की समस्या क्यों है
\n\nयदि आपने कभी C++ में लॉग पार्सर लिखा है, उपयोगकर्ता इनपुट पढ़ा है, या CSV फ़ाइलों को प्रोसेस किया है, तो आपने निश्चित रूप से समस्या का सामना किया होगा: स्ट्रिंग्स में "अतिरिक्त" स्पेस, टैब या न्यूलाइन आते हैं। Python में बिल्ट-इन strip() है, Java में trim() है, लेकिन C++ की स्टैंडर्ड लाइब्रेरी स्ट्रिंग ट्रिम करने के लिए कोई तैयार फंक्शन प्रदान नहीं करती। यह Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है (350,000 से अधिक व्यूज़), और आज हम एक बार और हमेशा के लिए समझेंगे कि इस समस्या को सुरुचिपूर्ण ढंग से कैसे हल किया जाए।
इस लेख में आप जानेंगे:
\n- \n
- C++ में बिल्ट-इन
trimक्यों नहीं है और इससे कैसे निपटें \n std::stringको ट्रिम करने के 5 सिद्ध तरीके \n - अपना सार्वभौमिक trim फंक्शन कैसे लिखें \n
- Boost का उपयोग कब करें और शुद्ध C++11/17 का कब \n
ट्रिम क्या है और इसकी आवश्यकता क्यों है?
\n\nट्रिम (स्ट्रिंग काटना) — स्ट्रिंग की शुरुआत, अंत या दोनों तरफ से व्हाइटस्पेस कैरेक्टर (स्पेस, टैब, न्यूलाइन, कैरिज रिटर्न) को हटाना है। C++ में यह आंतरिक रूप से पहले और आखिरी नॉन-स्पेस कैरेक्टर को खोजने और उनके बीच सबस्ट्रिंग बनाने तक सीमित हो जाता है।
\n\nविशिष्ट परिदृश्य जहाँ C++ में स्ट्रिंग ट्रिम करना महत्वपूर्ण है:
\n- \n
- फॉर्म वैलिडेशन — उपयोगकर्ता ने गलती से ईमेल से पहले स्पेस डाल दिया \n
- कॉन्फ़िगरेशन फ़ाइलों का पार्सिंग —
"key = value "जैसी स्ट्रिंग्स \n - नेटवर्क प्रोटोकॉल के साथ काम करना — अतिरिक्त कैरेक्टर हेडर को तोड़ देते हैं \n
- लॉग विश्लेषण — स्पेस खोज और तुलना में बाधा डालते हैं \n
तरीका 1: क्लासिक मैनुअल ट्रिम (C++98/03)
\n\nसबसे पुराना और समझने में आसान तरीका — find_first_not_of और find_last_not_of का उपयोग करना है। ये मेथड पहला/आखिरी कैरेक्टर ढूंढते हैं जो दिए गए सेट (डिफ़ॉल्ट रूप से स्पेस) में नहीं है।
#include <string>\n#include <cctype>\n\nstd::string trim(const std::string& str) {\n const std::string whitespace = " \\t\\n\\r\\f\\v";\n size_t start = str.find_first_not_of(whitespace);\n if (start == std::string::npos)\n return ""; // स्ट्रिंग केवल स्पेस से बनी है\n size_t end = str.find_last_not_of(whitespace);\n return str.substr(start, end - start + 1);\n}\n\nलाभ: किसी भी C++ स्टैंडर्ड पर काम करता है, कोई डिपेंडेंसी नहीं। नुकसान: एक नई स्ट्रिंग बनाता है (कॉपी करना)। अधिकांश कार्यों के लिए यह कोई समस्या नहीं है, लेकिन यदि आप लाखों स्ट्रिंग्स काट रहे हैं — तो प्रदर्शन के बारे में सोचें।
\n\nतरीका 2: इन-प्लेस मॉडिफिकेशन (in-place trim, C++11)
\n\nयदि आप बिना कॉपी किए मूल स्ट्रिंग को बदलना चाहते हैं, तो erase और इटरेटर का उपयोग करें। यह तरीका विशेष रूप से बड़े बफ़र्स के साथ काम करते समय उपयोगी है।
#include <string>\n#include <algorithm>\n\nstd::string& trim_in_place(std::string& str) {\n const std::string whitespace = " \\t\\n\\r\\f\\v";\n // शुरुआत से हटाएं\n str.erase(0, str.find_first_not_of(whitespace));\n // अंत से हटाएं\n size_t end = str.find_last_not_of(whitespace);\n if (end != std::string::npos)\n str.erase(end + 1);\n return str;\n}\n\nध्यान दें: शुरुआत से erase करने के बाद स्ट्रिंग शिफ्ट हो जाती है, जो बहुत लंबी स्ट्रिंग्स के लिए महंगा हो सकता है। लेकिन सामान्य मामलों (10K कैरेक्टर तक) के लिए — बढ़िया काम करता है।
तरीका 3: <algorithm> और लैम्ब्डा का उपयोग (C++17)
\n\nआधुनिक C++ अधिक डिक्लेरेटिव कोड लिखने की अनुमति देता है। पहले नॉन-स्पेस कैरेक्टर को खोजने के लिए std::find_if_not का उपयोग करें।
#include <string>\n#include <algorithm>\n#include <cctype>\n\nstd::string trim_modern(const std::string& str) {\n auto is_space = [](unsigned char ch) { return std::isspace(ch); };\n \n auto start = std::find_if_not(str.begin(), str.end(), is_sp