2011-03-09 12 views
5

के साथ बदलें, मैं कुछ लिखने की कोशिश कर रहा हूं जो अंडरस्कोर के साथ एक स्ट्रिंग में सभी रिक्त स्थान को प्रतिस्थापित करेगा।स्पेस को अंडरस्कोर

मेरे पास अब तक क्या है।

string space2underscore(string text) 
{ 
    for(int i = 0; i < text.length(); i++) 
    { 
     if(text[i] == ' ') 
      text[i] = '_'; 
    } 
    return text; 
} 

अधिकांश भाग के लिए यह काम करेगा, अगर मैं कुछ ऐसा कर रहा था।

string word = "hello stackoverflow"; 
word = space2underscore(word); 
cout << word; 

यह "हैलो_स्टैक ओवरफ्लो" आउटपुट होगा, जो कि मैं चाहता हूं।

लेकिन अगर मैं की तरह

string word; 
cin >> word; 
word = space2underscore(word); 
cout << word; 

कुछ करना था मैं सिर्फ पहला शब्द मिलेगा, "हैलो"।

क्या किसी को इसके लिए कोई फिक्स पता है?

उत्तर

13

समस्या यह है कि cin >> word केवल पहले शब्द में पढ़ा जा रहा है। यदि आप एक समय में पूरी तरह से काम करना चाहते हैं, तो आपको std::getline का उपयोग करना चाहिए।

उदाहरण के लिए:

std::string s; 
std::getline(std::cin, s); 
s = space2underscore(s); 
std::cout << s << std::endl; 

इसके अलावा, आप जांच करने के लिए कि आप वास्तव में एक पंक्ति को पढ़ने में सक्षम थे चाहते हो सकता है। आप क्या कर सकते हैं कि इस तरह:

std::string s; 
if(std::getline(std::cin, s)) { 
    s = space2underscore(s); 
    std::cout << s << std::endl; 
} 

अंत में, एक पक्ष नोट के रूप में, तो आप शायद अपने कार्य एक क्लीनर तरह से लिख सकते हैं। व्यक्तिगत रूप से मैं इसे इस तरह लिखना होगा:

std::string space2underscore(std::string text) { 
    for(std::string::iterator it = text.begin(); it != text.end(); ++it) { 
     if(*it == ' ') { 
      *it = '_'; 
     } 
    } 
    return text; 
} 

या बोनस अंक के लिए, std::transform का उपयोग करें!

संपादित करें: आप भाग्यशाली C++ 0x सुविधाओं का उपयोग करने में सक्षम होने के लिए होता है (और मुझे पता है कि अगर एक बड़ा है) आप lambdas और std::transform इस्तेमाल कर सकते हैं, जो कुछ बहुत ही सरल कोड में जो परिणाम हैं:

std::string s = "hello stackoverflow"; 
std::transform(s.begin(), s.end(), s.begin(), [](char ch) { 
    return ch == ' ' ? '_' : ch; 
}); 
std::cout << s << std::endl; 
+0

पैडेंटिक होने के लिए खेद है, लेकिन आप मिश्रण कर रहे हैं कि आप 'std ::' का उपयोग करते हैं या नहीं। (तकनीकी रूप से, आपका कोड 'std :: cout का उपयोग करके' शीर्ष पर काम करता है; –

+0

@Platinum Azure: आप सही हैं, व्यक्तिगत रूप से मैं एक स्पष्ट 'std ::' का उपयोग करना पसंद करता हूं लेकिन मैंने कुछ ओपी के कोड की प्रतिलिपि बनाई है मेरा उदाहरण मैं इसे साफ़ कर दूंगा। –

+0

धन्यवाद सर! मेरा प्रोग्राम अब ठीक चलाता है :) –

5

समस्या iostream पुस्तकालय से std::cin की अपनी समझ के साथ है: दाएँ हाथ की ओर तर्क के रूप में एक std::string के साथ एक धारा पर >> ऑपरेटर का उपयोग करते हुए एक बार में केवल एक शब्द (सफेद स्थान का उपयोग कर अलग करने के लिए) ले जाता है।

अपनी स्ट्रिंग प्राप्त करने के लिए std::getline() का उपयोग करना चाहते हैं।

-1

बदलें

cin >> word; 

साथ

getline(cin, word); 
10

आपको अपना getline समस्या ठीक हो गई है, लेकिन मैं बस कहना चाहता था कि मानक पुस्तकालय में बहुत सारे उपयोगी कार्य हैं।एक हाथ से लुढ़का पाश करने के बजाय आप कर सकता है:

std::string space2underscore(std::string text) 
{ 
    std::replace(text.begin(), text.end(), ' ', '_'); 
    return text; 
} 

यह काम करता है, यह तेजी से है, और यह वास्तव में व्यक्त करता है कि आप क्या कर रहे हैं।

0

एक आधुनिक सी ++ 1x दृष्टिकोण के लिए आपके पास std::regex_replace का विकल्प है।

#include <regex> 
#include <string> 
#include <cstdlib> 
#include <iostream> 

using std::cout; 
using std::endl; 
using std::regex; 
using std::string; 
using std::regex_replace; 

int main(const int, const char**) 
{ 
    const auto target = regex{ " " }; 
    const auto replacement = string{ "_" }; 
    const auto value = string{ "hello stackoverflow" }; 

    cout << regex_replace(value, target, replacement) << endl; 

    return EXIT_SUCCESS; 
} 

पेशेवरों: कम कोड।

विपक्ष: नियमित अभिव्यक्ति क्लाउड इरादा कर सकते हैं।

संबंधित मुद्दे