c++ - लूप का उपयोग करके किसी अन्य स्ट्रिंग से रिक्त स्थान के बिना एक नया स्ट्रिंग कैसे बनाएं




string (2)

मैंने एक फ़ंक्शन लिखने की कोशिश करना शुरू कर दिया है जो एक स्ट्रिंग से रिक्त स्थान को हटा देगा, लेकिन अब जब मैंने उस समस्या के अन्य लोगों के समाधानों के एक मेजबान को देखा है, तो मैं और अधिक समझने की कोशिश कर रहा हूं कि वास्तव में मेरे कोड में क्या गलत हुआ / क्यों std::cout << t << std::endl; अंत में कुछ भी आउटपुट नहीं करता है।

जब मैंने std::cout << t[count]; लूप के दौरान (यह कथन जो नीचे टिप्पणी की गई है) यह सही ढंग से कंसोल में आउटपुट करेगा: hereissometext रिक्त स्थान के बिना hereissometext । जब मेरे पास std::cout << t[0] << std::endl; अंत में, यह सही ढंग से h , t[1] को e , t[2] रूप में r , और इसी तरह से आउटपुट करता है। हालाँकि, जब मैं अंत में t आउटपुट करने की कोशिश करता हूं, तो यह रिक्त स्थान को आउटपुट करता है, और t.size() आउटपुट 0

मैं कोडिंग के लिए काफी नया हूं इसलिए मुझे माफ कर दो अगर यह पूरी तरह से स्पष्ट सवाल है।

    std::string s = "here is some text";
    std::string t = "";
    int count = 0;

    for (int i = 0; i < s.size(); i++) {
        if (std::isalpha(s[i])) {
            t[count]+=s[i];
            // std::cout << t[count];
            count++;
        }
    }

    std::cout << t << std::endl;

आपके पास आपके लूप में अपरिभाषित व्यवहार होता है, जैसा कि आप अपने operator[] का उपयोग करके एक std::string operator[] यह सुनिश्चित किए बिना कि उसका सही आकार है। आप इसके बजाय उपयोग कर सकते हैं

t.push_back(s[i]);

जो न केवल एक char सम्मिलित करता है, बल्कि यह सुनिश्चित करता है कि आंतरिक बफर (पुनः) आवंटित किया गया है जब यह नए स्ट्रिंग के लिए बहुत छोटा है।

आगे ध्यान दें कि आपको वास्तव में count चर की आवश्यकता नहीं है। std::string हमेशा अपनी लंबाई का पता t.size() , इसलिए t.size() हमेशा आपकी वर्तमान count का मूल्य प्राप्त करेगा (एक बार जब आप यूबी को ठीक करते हैं)।

एक तरफ के रूप में, एक निश्चित मानदंड से मेल खाने वाले अनुक्रम के हिस्सों की नकल करना एक सामान्य कार्य है, और इसमें एक विशिष्ट पुस्तकालय टेम्पलेट मौजूद है जो वास्तव में ऐसा करता है और आपको हाथ से तैयार किए गए लूप से मुक्त करता है:

#include <algorithm>

std::copy_if(s.cbegin(), s.cend(), std::back_inserter(t),
     [](char c){ return std::isalpha(c); });

अंत में, @MatthieurFoltzer द्वारा std::isalpha के व्यवहार पर टिप्पणी पर भी ध्यान दें, जो ध्यान में रखने योग्य हो सकता है।


मेरा सुझाव है कि हाथ से तैयार किए गए लूप का उपयोग न करें। आप अपनी स्थिति तैयार करने के लिए lambda अभिव्यक्ति के साथ संयोजन में std::copy_if उपयोग कर सकते हैं। यह आपके कार्यान्वयन से अधिक स्थिर होगा (क्या होगा यदि आपके स्ट्रिंग की लंबाई एक int की क्षमता से अधिक है?)। मुझे लगता है कि यह पठनीयता को भी बढ़ाता है।

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

int main() {
    std::string s = "here is some text";
    std::string t = "";
    auto comp = [&](const char c) { return std::isalpha(c); };
    std::copy_if(s.begin(), s.end(), std::back_inserter(t), comp);

    std::cout << t << std::endl;
}





string