एक स्ट्रिंग से अग्रणी और अनुगामी रिक्त स्थान निकालना


91

C ++ में स्ट्रिंग ऑब्जेक्ट से रिक्त स्थान कैसे निकालें।
उदाहरण के लिए, नीचे स्ट्रिंग ऑब्जेक्ट से अग्रणी और अनुगामी रिक्त स्थान कैसे निकालें।

//Original string: "         This is a sample string                    "
//Desired string: "This is a sample string"

स्ट्रिंग कक्षा, जहाँ तक मुझे पता है, अग्रणी और अनुगामी रिक्त स्थान को निकालने के लिए कोई भी तरीका प्रदान नहीं करता है।

समस्या में जोड़ने के लिए, स्ट्रिंग के शब्दों के बीच अतिरिक्त रिक्त स्थान को संसाधित करने के लिए इस स्वरूपण का विस्तार कैसे करें। उदाहरण के लिए,

// Original string: "          This       is         a sample   string    " 
// Desired string:  "This is a sample string"  

समाधान में वर्णित स्ट्रिंग विधियों का उपयोग करते हुए, मैं इन कार्यों को दो चरणों में करने के बारे में सोच सकता हूं।

  1. प्रमुख और अनुगामी रिक्त स्थान निकालें।
  2. वांछित स्वरूपण प्राप्त करने के लिए शब्द सीमाओं पर बार-बार find_first_of, find_last_of, find_first_not_of, find_last_not_of और पदार्थ का उपयोग करें ।

जवाबों:


127

इसे ट्रिमिंग कहा जाता है। यदि आप बूस्ट का उपयोग कर सकते हैं , तो मैं इसकी सलाह दूंगा।

अन्यथा, find_first_not_ofपहले गैर-व्हाट्सएप चरित्र के सूचकांक को प्राप्त करने के लिए उपयोग करें, फिर find_last_not_ofअंत में उस सूचकांक को प्राप्त करने के लिए जो व्हाट्सएप नहीं है। इन के साथ, substrबिना किसी व्हाट्सएप के उप-स्ट्रिंग प्राप्त करने के लिए उपयोग करें।

आपके संपादन के जवाब में, मुझे यह शब्द नहीं पता है, लेकिन मैं "कम" की तर्ज पर कुछ अनुमान लगाऊंगा, इसलिए मैंने इसे बुलाया। :) (ध्यान दें, मैंने लचीलेपन के लिए सफेद-स्थान को एक पैरामीटर के रूप में बदल दिया है)

#include <iostream>
#include <string>

std::string trim(const std::string& str,
                 const std::string& whitespace = " \t")
{
    const auto strBegin = str.find_first_not_of(whitespace);
    if (strBegin == std::string::npos)
        return ""; // no content

    const auto strEnd = str.find_last_not_of(whitespace);
    const auto strRange = strEnd - strBegin + 1;

    return str.substr(strBegin, strRange);
}

std::string reduce(const std::string& str,
                   const std::string& fill = " ",
                   const std::string& whitespace = " \t")
{
    // trim first
    auto result = trim(str, whitespace);

    // replace sub ranges
    auto beginSpace = result.find_first_of(whitespace);
    while (beginSpace != std::string::npos)
    {
        const auto endSpace = result.find_first_not_of(whitespace, beginSpace);
        const auto range = endSpace - beginSpace;

        result.replace(beginSpace, range, fill);

        const auto newStart = beginSpace + fill.length();
        beginSpace = result.find_first_of(whitespace, newStart);
    }

    return result;
}

int main(void)
{
    const std::string foo = "    too much\t   \tspace\t\t\t  ";
    const std::string bar = "one\ntwo";

    std::cout << "[" << trim(foo) << "]" << std::endl;
    std::cout << "[" << reduce(foo) << "]" << std::endl;
    std::cout << "[" << reduce(foo, "-") << "]" << std::endl;

    std::cout << "[" << trim(bar) << "]" << std::endl;
}

परिणाम:

[too much               space]  
[too much space]  
[too-much-space]  
[one  
two]  

मुझे लगता है कि आप 'size_t' का मतलब है। और आप सबस्ट्रिंग पर एक-के-बाद-एक हो गए हैं, सबस्टीट्यूट होना चाहिए (शुरुआती, एंडस्ट्रीम - बिगस्टार + 1);
GoldPseudo

होना site_tचाहिए size_t? और मुझे लगता है कि जहां आपके पास टिप्पणी no whitespaceहै उसका मतलब है कि स्ट्रिंग सभी व्हाट्सएप या खाली है।
फ्रेड लार्सन

धन्यवाद, size_tसंपादन में टाइपो और एक-एक करके तय किया , लेकिन ध्यान नहीं दिया मेरी टिप्पणी उलटा थी, धन्यवाद।
GMNNICKG

@GMan बहुत सुरुचिपूर्ण समाधान। धन्यवाद।
अंकुर

बग: ट्रिम () के माध्यम से "एक \ ttwo" चलाने का प्रयास करें। परिणाम एक रिक्त स्ट्रिंग है। आपको std :: string :: npos के खिलाफ भी endStr का परीक्षण करना होगा।
dlchambers 19

48

एक पंक्ति में std :: string से अग्रणी, अनुगामी और अतिरिक्त रिक्त स्थान निकालना आसान

value = std::regex_replace(value, std::regex("^ +| +$|( ) +"), "$1");

केवल प्रमुख रिक्त स्थान हटा रहा है

value.erase(value.begin(), std::find_if(value.begin(), value.end(), std::bind1st(std::not_equal_to<char>(), ' ')));

या

value = std::regex_replace(value, std::regex("^ +"), "");

केवल अनुगामी रिक्त स्थान निकाल रहा है

value.erase(std::find_if(value.rbegin(), value.rend(), std::bind1st(std::not_equal_to<char>(), ' ')).base(), value.end());

या

value = std::regex_replace(value, std::regex(" +$"), "");

केवल अतिरिक्त रिक्त स्थान निकाल रहा है

value = regex_replace(value, std::regex(" +"), " ");

3
अच्छा है। यहां क्या हो रहा है, इसके बारे में कुछ जानकारी प्रदान करना उपयोगी होगा, क्योंकि इन कोड को समझना मुश्किल है।
मार्सिन

केवल C ++ 11 में काम करता है, हालांकि।
मार्टिन पेका

7
यह टैब को हटाता नहीं है लेकिन इसे ठीक किया जा सकता है। क्या तय नहीं किया जा सकता है कि यह बहुत धीमा है ( substrया के साथ जवाब की तुलना में 100 गुना धीमा erase)।
4LegsDrivenCat

गति अनुकूलन के लिए रेगेक्स इष्टतम समाधान नहीं है, लेकिन इसे एक बार रेगेक्स का उदाहरण बनाकर सुधारा जा सकता है
एवगेनी कारपोव

40

मैं वर्तमान में इन कार्यों का उपयोग कर रहा हूं:

// trim from left
inline std::string& ltrim(std::string& s, const char* t = " \t\n\r\f\v")
{
    s.erase(0, s.find_first_not_of(t));
    return s;
}

// trim from right
inline std::string& rtrim(std::string& s, const char* t = " \t\n\r\f\v")
{
    s.erase(s.find_last_not_of(t) + 1);
    return s;
}

// trim from left & right
inline std::string& trim(std::string& s, const char* t = " \t\n\r\f\v")
{
    return ltrim(rtrim(s, t), t);
}

// copying versions

inline std::string ltrim_copy(std::string s, const char* t = " \t\n\r\f\v")
{
    return ltrim(s, t);
}

inline std::string rtrim_copy(std::string s, const char* t = " \t\n\r\f\v")
{
    return rtrim(s, t);
}

inline std::string trim_copy(std::string s, const char* t = " \t\n\r\f\v")
{
    return trim(s, t);
}


9

यह मेरे लिए प्रमुख और अनुगामी रिक्त स्थान को अलग करने का उपाय है ...

std::string stripString = "  Plamen     ";
while(!stripString.empty() && std::isspace(*stripString.begin()))
    stripString.erase(stripString.begin());

while(!stripString.empty() && std::isspace(*stripString.rbegin()))
    stripString.erase(stripString.length()-1);

परिणाम "प्लामेन" है


8

यहाँ आप इसे कैसे कर सकते हैं:

std::string & trim(std::string & str)
{
   return ltrim(rtrim(str));
}

और सहायक कार्य इस प्रकार हैं:

std::string & ltrim(std::string & str)
{
  auto it2 =  std::find_if( str.begin() , str.end() , [](char ch){ return !std::isspace<char>(ch , std::locale::classic() ) ; } );
  str.erase( str.begin() , it2);
  return str;   
}

std::string & rtrim(std::string & str)
{
  auto it1 =  std::find_if( str.rbegin() , str.rend() , [](char ch){ return !std::isspace<char>(ch , std::locale::classic() ) ; } );
  str.erase( it1.base() , str.end() );
  return str;   
}

और एक बार जब आप ये सब कर लेते हैं, तो आप इसे भी लिख सकते हैं:

std::string trim_copy(std::string const & str)
{
   auto s = str;
   return ltrim(rtrim(s));
}

इसे इस्तेमाल करे


7

बढ़ावा देने के लिए जौन-हैसन के सुझाव के बाद ट्रिम अग्रणी और अनुगामी रिक्त स्थान के लिए उदाहरण (केवल अनुगामी और लंबित रिक्त स्थान हटाता है):

#include <boost/algorithm/string/trim.hpp>

std::string str = "   t e s t    ";

boost::algorithm::trim ( str );

का परिणाम "t e s t"

वहाँ भी

  • trim_left का परिणाम "t e s t "
  • trim_right का परिणाम " t e s t"

5
/// strip a string, remove leading and trailing spaces
void strip(const string& in, string& out)
{
    string::const_iterator b = in.begin(), e = in.end();

    // skipping leading spaces
    while (isSpace(*b)){
        ++b;
    }

    if (b != e){
        // skipping trailing spaces
        while (isSpace(*(e-1))){
            --e;
        }
    }

    out.assign(b, e);
}

उपरोक्त कोड में, isSpace () फ़ंक्शन एक बूलियन फ़ंक्शन है जो बताता है कि एक वर्ण एक सफेद स्थान है, तो आप अपनी आवश्यकताओं को प्रतिबिंबित करने के लिए इस फ़ंक्शन को लागू कर सकते हैं, या यदि आप चाहें तो isspace ("ctype.h") से कॉल कर सकते हैं। ।


4

प्रमुख और अनुगामी स्थानों को ट्रिम करने के लिए उदाहरण

std::string aString("    This is a string to be trimmed   ");
auto start = aString.find_first_not_of(' ');
auto end = aString.find_last_not_of(' ');
std::string trimmedString;
trimmedString = aString.substr(start, (end - start) + 1);

या

trimmedSring = aString.substr(aString.find_first_not_of(' '), (aString.find_last_not_of(' ') - aString.find_first_not_of(' ')) + 1);

3
किसी स्ट्रिंग को ट्रिम करने का तरीका जानने के लिए लोग कोड के 10 पृष्ठों को देखना पसंद नहीं करेंगे।
थिंकल VB

2
यह टूट गया है यदि स्ट्रिंग में केवल रिक्त स्थान है
DAG

3

मानक पुस्तकालय का उपयोग करने के कई फायदे हैं, लेकिन कुछ विशेष मामलों के बारे में पता होना चाहिए जो अपवाद का कारण बनते हैं। उदाहरण के लिए, कोई भी उत्तर उस मामले को कवर नहीं करता जहां सी ++ स्ट्रिंग में कुछ यूनिकोड वर्ण हैं। इस स्थिति में, यदि आप फ़ंक्शन आइसस्पेस का उपयोग करते हैं, तो एक अपवाद फेंक दिया जाएगा।

मैं स्ट्रिंग्स को ट्रिम करने के लिए निम्नलिखित कोड का उपयोग कर रहा हूं और कुछ अन्य ऑपरेशन जो काम में आ सकते हैं। इस कोड के प्रमुख लाभ हैं: यह वास्तव में तेज़ है (किसी भी कोड की तुलना में मैंने कभी परीक्षण किया है), यह केवल मानक पुस्तकालय का उपयोग करता है, और यह कभी भी अपवाद का कारण नहीं बनता है:

#include <string>
#include <algorithm>
#include <functional>
#include <locale>
#include <iostream>

typedef unsigned char BYTE;

std::string strTrim(std::string s, char option = 0)
{
    // convert all whitespace characters to a standard space
    std::replace_if(s.begin(), s.end(), (std::function<int(BYTE)>)::isspace, ' ');

    // remove leading and trailing spaces
    size_t f = s.find_first_not_of(' ');
    if (f == std::string::npos) return "";
    s = s.substr(f, s.find_last_not_of(' ') - f + 1);

    // remove consecutive spaces
    s = std::string(s.begin(), std::unique(s.begin(), s.end(),
        [](BYTE l, BYTE r){ return l == ' ' && r == ' '; }));

    switch (option)
    {
    case 'l':  // convert to lowercase
        std::transform(s.begin(), s.end(), s.begin(), ::tolower);
        return s;
    case 'U':  // convert to uppercase
        std::transform(s.begin(), s.end(), s.begin(), ::toupper);
        return s;
    case 'n':  // remove all spaces
        s.erase(std::remove(s.begin(), s.end(), ' '), s.end());
        return s;
    default: // just trim
        return s;
    }
}

3

यह सब से सरल हो सकता है।

आप दोनों तरफ से व्हाट्सएप का उपयोग कर सकते हैं string::findऔर string::rfindस्ट्रिंग को कम कर सकते हैं।

void TrimWord(std::string& word)
{
    if (word.empty()) return;

    // Trim spaces from left side
    while (word.find(" ") == 0)
    {
        word.erase(0, 1);
    }

    // Trim spaces from right side
    size_t len = word.size();
    while (word.rfind(" ") == --len)
    {
        word.erase(len, len + 1);
    }
}

2

मैंने यह परीक्षण किया है, यह सब काम करता है। तो यह विधि processInput सिर्फ उपयोगकर्ता को कुछ टाइप करने के लिए कहेगी। यह एक स्ट्रिंग लौटाएगा जिसमें आंतरिक रूप से कोई अतिरिक्त स्थान नहीं है, न ही शुरुआत या अंत में अतिरिक्त स्थान। उम्मीद है की यह मदद करेगा। (इसे समझने में सरल बनाने के लिए टिप्पणी करने का एक ढेर भी लगाएं)।

आप देख सकते हैं कि इसे मुख्य () तल पर कैसे लागू किया जाए

#include <string>
#include <iostream>

string processInput() {
  char inputChar[256];
  string output = "";
  int outputLength = 0;
  bool space = false;
  // user inputs a string.. well a char array
  cin.getline(inputChar,256);
  output = inputChar;
       string outputToLower = "";
  // put characters to lower and reduce spaces
  for(int i = 0; i < output.length(); i++){
    // if it's caps put it to lowercase
    output[i] = tolower(output[i]);
    // make sure we do not include tabs or line returns or weird symbol for null entry array thingy
    if (output[i] != '\t' && output[i] != '\n' && output[i] != 'Ì') {
      if (space) {
        // if the previous space was a space but this one is not, then space now is false and add char
        if (output[i] != ' ') {
          space = false;
          // add the char
          outputToLower+=output[i];
        }
      } else {
        // if space is false, make it true if the char is a space
        if (output[i] == ' ') {
          space = true;
        }
        // add the char
        outputToLower+=output[i];
      }
    }
  }
  // trim leading and tailing space
  string trimmedOutput = "";
  for(int i = 0; i < outputToLower.length(); i++){
    // if it's the last character and it's not a space, then add it
    // if it's the first character and it's not a space, then add it
    // if it's not the first or the last then add it
    if (i == outputToLower.length() - 1 && outputToLower[i] != ' ' || 
      i == 0 && outputToLower[i] != ' ' || 
      i > 0 && i < outputToLower.length() - 1) {
      trimmedOutput += outputToLower[i];
    } 
  }
  // return
  output = trimmedOutput;
  return output;
}

int main() {
  cout << "Username: ";
  string userName = processInput();
  cout << "\nModified Input = " << userName << endl;
}

2

क्यों उलझी?

std::string removeSpaces(std::string x){
    if(x[0] == ' ') { x.erase(0, 1); return removeSpaces(x); }
    if(x[x.length() - 1] == ' ') { x.erase(x.length() - 1, x.length()); return removeSpaces(x); }
    else return x;
}

यह काम करता है भले ही बूस्ट फेल हो गया हो, कोई रेगेक्स, कोई अजीब सामान और न ही लाइब्रेरी।

EDIT: MM की टिप्पणी के लिए ठीक करें।


यह कुछ हद तक अक्षम है, व्हॉट्सएप की लंबाई की गणना करने और प्रत्येक छोर के लिए एक एकल कॉल का उपयोग करने की तुलना में
एमएम

1

सी ++ 17 पेश किया std::basic_string_view, एक वर्ग टेम्पलेट जो चार-सदृश वस्तुओं के निरंतर सन्निहित अनुक्रम को संदर्भित करता है, अर्थात स्ट्रिंग का एक दृश्य। एक बहुत ही समान इंटरफ़ेस होने के अलावा std::basic_string, इसके दो अतिरिक्त कार्य हैं: remove_prefix()जो इसके प्रारंभ को आगे बढ़ाकर दृश्य को सिकोड़ता है; और remove_suffix(), जो अपने अंत को पीछे की ओर ले जाकर दृश्य को सिकोड़ता है। इनका उपयोग अग्रणी और अनुगामी स्थान को ट्रिम करने के लिए किया जा सकता है:

#include <string_view>
#include <string>

std::string_view ltrim(std::string_view str)
{
    const auto pos(str.find_first_not_of(" \t"));
    str.remove_prefix(pos);
    return str;
}

std::string_view rtrim(std::string_view str)
{
    const auto pos(str.find_last_not_of(" \t"));
    str.remove_suffix(str.length() - pos - 1);
    return str;
}

std::string_view trim(std::string_view str)
{
    str = ltrim(str);
    str = rtrim(str);
    return str;
}

int main()
{
    std::string str = "   hello world   ";
    auto sv1{ ltrim(str) };  // "hello world   "
    auto sv2{ rtrim(str) };  // "   hello world"
    auto sv3{ trim(str) };   // "hello world"

    //If you want, you can create std::string objects from std::string_view objects
    auto s1{ sv1 };
    auto s2{ sv2 };
    auto s3{ sv3 };
}

नोट: std::string_viewएक गैर-मालिकाना संदर्भ है, इसलिए यह केवल तब तक मान्य है जब तक मूल स्ट्रिंग अभी भी मौजूद है।


0
    char *str = (char*) malloc(50 * sizeof(char));
    strcpy(str, "    some random string (<50 chars)  ");

    while(*str == ' ' || *str == '\t' || *str == '\n')
            str++;

    int len = strlen(str);

    while(len >= 0 && 
            (str[len - 1] == ' ' || str[len - 1] == '\t' || *str == '\n')
    {
            *(str + len - 1) = '\0';
            len--;
    }

    printf(":%s:\n", str);

0
void removeSpaces(string& str)
{
    /* remove multiple spaces */
    int k=0;
    for (int j=0; j<str.size(); ++j)
    {
            if ( (str[j] != ' ') || (str[j] == ' ' && str[j+1] != ' ' ))
            {
                    str [k] = str [j];
                    ++k;
            }

    }
    str.resize(k);

    /* remove space at the end */   
    if (str [k-1] == ' ')
            str.erase(str.end()-1);
    /* remove space at the begin */
    if (str [0] == ' ')
            str.erase(str.begin());
}

0
string trim(const string & sStr)
{
    int nSize = sStr.size();
    int nSPos = 0, nEPos = 1, i;
    for(i = 0; i< nSize; ++i) {
        if( !isspace( sStr[i] ) ) {
            nSPos = i ;
            break;
        }
    }
    for(i = nSize -1 ; i >= 0 ; --i) {
        if( !isspace( sStr[i] ) ) {
            nEPos = i;
            break;
        }
    }
    return string(sStr, nSPos, nEPos - nSPos + 1);
}

0

अग्रणी और अनुगामी स्थानों के लिए, कैसे के बारे में:

string string_trim(const string& in) {

    stringstream ss;
    string out;
    ss << in;
    ss >> out;
    return out;

}

या एक वाक्य के लिए:

string trim_words(const string& sentence) {
    stringstream ss;
    ss << sentence;
    string s;
    string out;

    while(ss >> s) {

        out+=(s+' ');
    }
    return out.substr(0, out.length()-1);
}

0

साफ़ सुथरा

 void trimLeftTrailingSpaces(string &input) {
        input.erase(input.begin(), find_if(input.begin(), input.end(), [](int ch) {
            return !isspace(ch);
        }));
    }

    void trimRightTrailingSpaces(string &input) {
        input.erase(find_if(input.rbegin(), input.rend(), [](int ch) {
            return !isspace(ch);
        }).base(), input.end());
    }

0

नहीं boost, नहीं regex, सिर्फ stringपुस्तकालय। यह इत्ना आसान है।

string trim(const string s) { // removes whitespace characters from beginnig and end of string s
    const int l = (int)s.length();
    int a=0, b=l-1;
    char c;
    while(a<l && ((c=s.at(a))==' '||c=='\t'||c=='\n'||c=='\v'||c=='\f'||c=='\r'||c=='\0')) a++;
    while(b>a && ((c=s.at(b))==' '||c=='\t'||c=='\n'||c=='\v'||c=='\f'||c=='\r'||c=='\0')) b--;
    return s.substr(a, 1+b-a);
}

1
... और आपने अपनी बिल्ड में हेडर फ़ाइलों के 2M लाने से परहेज किया!
लैरी_ सी

0

समस्या में जोड़ने के लिए, स्ट्रिंग के शब्दों के बीच अतिरिक्त रिक्त स्थान को संसाधित करने के लिए इस स्वरूपण का विस्तार कैसे करें।

वास्तव में, यह कई प्रमुख और अनुगामी श्वेत-अंतरिक्ष पात्रों के लिए लेखांकन की तुलना में एक सरल मामला है। आपको केवल पूरे स्ट्रिंग से डुप्लिकेट आसन्न व्हाइट-स्पेस वर्णों को निकालने की आवश्यकता है।

आसन्न सफेद अंतरिक्ष के लिए विधेय बस होगा:

auto by_space = [](unsigned char a, unsigned char b) {
    return std::isspace(a) and std::isspace(b);
};

और फिर आप उन डुप्लिकेट आसन्न सफेद-अंतरिक्ष वर्णों से छुटकारा पा सकते हैं std::unique, और मिटाए गए मुहावरे:

// s = "       This       is       a sample   string     "  
s.erase(std::unique(std::begin(s), std::end(s), by_space), 
        std::end(s));
// s = " This is a sample string "  

यह संभावित रूप से सामने और / या पीछे एक अतिरिक्त सफेद-अंतरिक्ष चरित्र छोड़ देता है। इसे काफी आसानी से हटाया जा सकता है:

if (std::size(s) && std::isspace(s.back()))
    s.pop_back();

if (std::size(s) && std::isspace(s.front()))
    s.erase(0, 1);

यहाँ एक डेमो है


-1

इस समस्या के लिए मेरा समाधान किसी भी एसटीएल विधियों का उपयोग नहीं कर रहा है, लेकिन केवल C ++ स्ट्रिंग के अपने तरीके निम्नलिखित हैं:

void processString(string &s) {
    if ( s.empty() ) return;

    //delete leading and trailing spaces of the input string
    int notSpaceStartPos = 0, notSpaceEndPos = s.length() - 1;
    while ( s[notSpaceStartPos] == ' ' ) ++notSpaceStartPos;
    while ( s[notSpaceEndPos] == ' ' ) --notSpaceEndPos;
    if ( notSpaceStartPos > notSpaceEndPos ) { s = ""; return; }
    s = s.substr(notSpaceStartPos, notSpaceEndPos - notSpaceStartPos + 1);

    //reduce multiple spaces between two words to a single space 
    string temp;
    for ( int i = 0; i < s.length(); i++ ) {
        if ( i > 0 && s[i] == ' ' && s[i-1] == ' ' ) continue;
        temp.push_back(s[i]);
    }
    s = temp;
}

मैंने इस पद्धति का उपयोग एक स्ट्रिंग में LeetCode समस्या को उल्टा शब्दों को पारित करने के लिए किया है


-1
void TrimWhitespaces(std::wstring& str)
{
    if (str.empty())
        return;

    const std::wstring& whitespace = L" \t";
    std::wstring::size_type strBegin = str.find_first_not_of(whitespace);
    std::wstring::size_type strEnd = str.find_last_not_of(whitespace);

    if (strBegin != std::wstring::npos || strEnd != std::wstring::npos)
    {
        strBegin == std::wstring::npos ? 0 : strBegin;
        strEnd == std::wstring::npos ? str.size() : 0;

        const auto strRange = strEnd - strBegin + 1;
        str.substr(strBegin, strRange).swap(str);
    }
    else if (str[0] == ' ' || str[0] == '\t')   // handles non-empty spaces-only or tabs-only
    {
        str = L"";
    }
}

void TrimWhitespacesTest()
{
    std::wstring EmptyStr = L"";
    std::wstring SpacesOnlyStr = L"    ";
    std::wstring TabsOnlyStr = L"           ";
    std::wstring RightSpacesStr = L"12345     ";
    std::wstring LeftSpacesStr = L"     12345";
    std::wstring NoSpacesStr = L"12345";

    TrimWhitespaces(EmptyStr);
    TrimWhitespaces(SpacesOnlyStr);
    TrimWhitespaces(TabsOnlyStr);
    TrimWhitespaces(RightSpacesStr);
    TrimWhitespaces(LeftSpacesStr);
    TrimWhitespaces(NoSpacesStr);

    assert(EmptyStr == L"");
    assert(SpacesOnlyStr == L"");
    assert(TabsOnlyStr == L"");
    assert(RightSpacesStr == L"12345");
    assert(LeftSpacesStr == L"12345");
    assert(NoSpacesStr == L"12345");
}

-2

के बारे में क्या मिटा-निकालें मुहावरा ?

std::string s("...");
s.erase( std::remove(s.begin(), s.end(), ' '), s.end() );

माफ़ करना। मैंने बहुत देर से देखा कि आप सभी व्हाट्सएप को हटाना नहीं चाहते हैं ।


नमस्ते, अब जब आप जानते हैं कि उत्तर गलत है, आप चाहें तो इसे हटा सकते हैं। इस तरह, आप इस जवाब पर DVs से हार चुके प्रतिनिधि को वापस पा लेंगे :)
सिगरेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.