2013-01-09 19 views
21

सी ++ में, एक आसान तरीका क्या चालू करने के लिए:निकालें खाली स्थान के :: स्ट्रिंग

यह std :: स्ट्रिंग

\t\tHELLO WORLD\r\nHELLO\t\nWORLD  \t 

में:

HELLOWORLDHELLOWORLD 
+1

@ tomislav-maric मुझे नहीं लगता कि यह उस पोस्ट का डुप्लिकेट है, ओपी वहां 'सिने' स्ट्रीम के साथ काम कर रहा था, और इस प्रकार iostream कार्यों का उपयोग कर रहा था। –

+0

समान लेकिन सटीक डुप्लिकेट नहीं, इसलिए बंद करने के लिए वोट नहीं दे रहा है। – CashCow

+0

@CashCow मैंने इसे दोबारा जांच लिया .. आप सही हैं, इसके बारे में खेद है। – tmaric

उत्तर

33

std::remove_if के सरल संयोजन और std::string::erase

नहीं पूरी तरह से सुरक्षित संस्करण

s.erase(std::remove_if(s.begin(), s.end(), ::isspace), s.end()); 

सुरक्षित संस्करण के लिए साथ

std::bind(std::isspace<char>, _1, std::locale::classic()) 

एक संस्करण है कि वैकल्पिक चरित्र प्रकार के साथ काम करता लिए

(सभी प्रासंगिक हैडर शामिल करें) ::isspace की जगह के साथ <char> की जगह <ElementType> या जो भी आपके टेम्पलेटेड चरित्र प्रकार है। आप निश्चित रूप से लोकेल को एक अलग से बदल सकते हैं। यदि आप ऐसा करते हैं, तो लोकेल पहलू को कई बार पुनर्निर्माण की अक्षमता से बचने के लिए सावधान रहें।

C++ में 11 आप के साथ एक लैम्ब्डा में सुरक्षित संस्करण बना सकते हैं:

[](char ch) { return std::isspace<char>(ch, std::locale::classic()); } 
+0

@chris ':: isspace' में नया शामिल है लाइन भी: http://www.cplusplus.com/reference/cctype/isspace/ –

+0

यह होगा। न्यूलाइन के लिए जारी करने के लिए जारी किया जाएगा। – CashCow

+4

'जारीस्थान' में मूलभूत कुछ चीज़ों को छोड़कर सभी वर्णों के लिए यूबी है। सी 99 §7.4/1। –

2

आप इस्तेमाल कर सकते हैं Boost.Algorithm के erase_all

#include <boost/algorithm/string/erase.hpp> 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::string s = "Hello World!"; 
    // or the more expensive one-liner in case your string is const 
    // std::cout << boost::algorithm::erase_all_copy(s, " ") << "\n"; 
    boost::algorithm::erase_all(s, " "); 
    std::cout << s << "\n"; 
} 

नोट: के रूप में टिप्पणी में उल्लेख किया गया है: trim_copy (या उसके चचेरे भाई trim_copy_left और trim_copy_right) केवल स्ट्रिंग की शुरुआत और अंत से व्हाइटस्पेस को हटा दें।

+0

मैंने बूस्ट का उपयोग करने वाले कुछ समाधान देखा, लेकिन मैं 'ट्रिम' फ़ंक्शन के बाद नहीं हूं, मुझे लगता है कि मुझे विश्वास है कि 'XX ___ XX_'' -> 'XX_XX' जबकि मैं अंतिम समाधान' XXXX' होना चाहता हूं। –

+0

@ श्री स्मिथ टीएनएक्स, अद्यतन। – TemplateRex

11

तो सी ++ 03

struct RemoveDelimiter 
{ 
    bool operator()(char c) 
    { 
    return (c =='\r' || c =='\t' || c == ' ' || c == '\n'); 
    } 
}; 

std::string s("\t\tHELLO WORLD\r\nHELLO\t\nWORLD  \t"); 
s.erase(std::remove_if(s.begin(), s.end(), RemoveDelimiter()), s.end()); 

या का उपयोग सी ++ 11 लैम्ब्डा

s.erase(std::remove_if(s.begin(), s.end(), 
    [](char c){ return (c =='\r' || c =='\t' || c == ' ' || c == '\n');}), s.end()); 

पी एस। Erase-remove idiom

1

चरित्र द्वारा चरित्र के माध्यम से कदम और string::erase() का उपयोग करके ठीक काम करना चाहिए।

void removeWhitespace(std::string& str) { 
    for (size_t i = 0; i < str.length(); i++) { 
     if (str[i] == ' ' || str[i] == '\n' || str[i] == '\t') { 
      str.erase(i, 1); 
      i--; 
     } 
    } 
} 
+1

आसन्न अंतरिक्ष वर्ण होने पर काम नहीं करता है। पहला व्यक्ति मिटा दिया जाता है, दूसरे स्थान को 'i'' पर ले जाता है। फिर आप लूप के चारों ओर जाते हैं, 'i' वृद्धि करते हैं, और दूसरी बार कभी नहीं देखते हैं। –

+0

आप सही हैं। ठीक कर दिया। – SelectricSimian

2

C++ 11

std::string input = "\t\tHELLO WORLD\r\nHELLO\t\nWORLD  \t"; 

auto rs = std::regex_replace(input,std::regex("\\s+"), ""); 

std::cout << rs << std::endl; 

/tmp ❮❮❮ ./play

HELLOWORLDHELLOWORLD 
3

सी ++ 11 में आप का उपयोग करने से एक लैम्ब्डा बल्कि उपयोग कर सकते हैं std :: bind:

str.erase(
    std::remove_if(str.begin(), str.end(), 
     [](char c) -> bool 
     { 
      return std::isspace<char>(c, std::locale::classic()); 
     }), 
    str.end()); 
संबंधित मुद्दे