2013-10-02 2 views
10

से विराम चिह्न हटाएं मुझे एक स्ट्रिंग मिली है और मैं इससे सभी विराम चिह्नों को हटाना चाहता हूं। मैं उसको कैसे करू? मैंने कुछ शोध किया और पाया कि लोग ispunct() फ़ंक्शन का उपयोग करते हैं (मैंने कोशिश की है), लेकिन मुझे लगता है कि यह मेरे कोड में काम करने के लिए प्रतीत नहीं होता है। किसी को भी कोई विचार है?सी ++ स्ट्रिंग

#include <string> 

int main() { 

string text = "this. is my string. it's here." 

if (ispunct(text)) 
text.erase(); 

return 0; 
} 
+0

आपको सभी पात्रों को एक-एक करके जांचना चाहिए। –

उत्तर

-3

मैं यह मिल गया। आप एक नया स्ट्रिंग के रूप में परिणाम की जरूरत है

size_t found = text.find('.'); 
text.erase(found, 1); 
+0

यह केवल '।' का पहला उदाहरण मिटा देगा, यह सभी विराम चिह्नों को नहीं हटाता है, न कि '।' के सभी उदाहरण। – pippin1289

+0

लेकिन लूप के साथ यह – NewFile

+0

काम करता है, आपको दूसरों को गुमराह करने के लिए अपने उत्तरों को संपादित करना चाहिए। लेकिन यह केवल सभी विराम चिह्नों को हटा नहीं देता है। – pippin1289

5

ispunct एक char नहीं मान एक स्ट्रिंग लेता है।

आप

तरह
for (auto c : string) 
    if (ispunct(c)) text.erase(text.find_first_of(c)); 

यह काम करेंगे कर सकते हैं, लेकिन यह एक धीमी गति से एल्गोरिथ्म है।

+3

text.erase()? क्या आपको यकीन है? –

+1

आपने मुझे मिला। 'text.erase()' काम नहीं करेगा। –

1

समस्या यह है कि ispunct() एक तर्क होने पर एक तर्क लेता है, जबकि आप एक स्ट्रिंग भेजने की कोशिश कर रहे हैं। आप स्ट्रिंग के तत्वों से अधिक पाश चाहिए और हर किरदार को मिटा यहाँ की तरह एक विराम चिह्न है:

for(size_t i = 0; i<text.length(); ++i) 
    if(ispunct(text[i])) 
    text.erase(i--, 1); 
4
#include <string> 
#include <iostream> 
#include <cctype> 

int main() { 

    std::string text = "this. is my string. it's here."; 

    for (int i = 0, len = text.size(); i < len; i++) 
    { 
     if (ispunct(text[i])) 
     { 
      text.erase(i--, 1); 
      len = text.size(); 
     } 
    } 

    std::cout << text; 
    return 0; 
} 

आउटपुट

this is my string its here 

जब आप एक चरित्र है, के आकार को नष्ट स्ट्रिंग बदलती है। जब भी हटाना होता है इसे अद्यतन किया जाना चाहिए। और, आपने वर्तमान चरित्र को हटा दिया है, इसलिए अगला चरित्र वर्तमान चरित्र बन जाता है। यदि आप लूप काउंटर को कम नहीं करते हैं, तो विराम चिह्न के बगल में वर्ण की जांच नहीं की जाएगी।

+0

मैं संकलन करने के लिए ispunct प्राप्त नहीं कर सकता। मैंने आपके द्वारा किए गए सभी शीर्षकों को शामिल किया है। – NewFile

+1

आपको या तो '' या '' शामिल करना होगा। – thefourtheye

19

एल्गोरिथ्म remove_copy_if का प्रयोग: -

string text,result; 
std::remove_copy_if(text.begin(), text.end(),    
         std::back_inserter(result), //Store output   
         std::ptr_fun<int, int>(&std::ispunct) 
         ); 
1
#include <iostream> 
#include <string> 
#include <algorithm> 
using namespace std; 

int main() { 
    string str = "this. is my string. it's here."; 

    transform(str.begin(), str.end(), str.begin(), [](char ch) 
    { 
     if(ispunct(ch)) 
      return '\0'; 
     return ch; 
    }); 
} 
8

पाउ पहले से ही एक अच्छा जवाब है। यह उत्तर यह है कि यदि आप इन-प्लेस अपडेट चाहते हैं तो इसे कैसे संभालें।

नुस्खा का पहला भाग std::remove_if है, जो विराम चिह्न को प्रभावी ढंग से हटा सकता है, क्योंकि यह सभी गैर-विराम चिह्नों को पैक करता है।

std::remove_if (text.begin(), text.end(), ispunct) 

दुर्भाग्य से, std::remove_if नए आकार को स्ट्रिंग हटना नहीं करता है। ऐसा इसलिए नहीं हो सकता क्योंकि इसमें कंटेनर की पहुंच नहीं है। इसलिए, पैक किए गए परिणाम के बाद स्ट्रिंग में जंक वर्ण शेष हैं।

इसे संभालने के लिए, std::remove_if एक पुनरावर्तक देता है जो अभी भी आवश्यक स्ट्रिंग का हिस्सा इंगित करता है। यह तार erase विधि, निम्नलिखित मुहावरा के लिए अग्रणी के साथ प्रयोग किया जा सकता है ...

text.erase (std::remove_if (text.begin(), text.end(), ispunct), text.end()); 

[संपादित - मैं विश्वास नहीं कर सकता मैं सिर्फ इतना है कि गलत - erase के लिए iterators रेंज का संकेत देना चाहिए दूर करने के लिए , रखने की सीमा नहीं है।]

मैं इसे एक मुहावरे कहता हूं क्योंकि यह एक आम तकनीक है जो कई स्थितियों में काम करती है।string से अन्य प्रकार erase विधियों, और std::remove (और शायद कुछ अन्य एल्गोरिदम लाइब्रेरी फ़ंक्शंस जिन्हें मैं इस पल के लिए भूल गया हूं) प्रदान करता हूं, वे उन चीज़ों के अंतराल को बंद करने के इस दृष्टिकोण को लेते हैं, लेकिन कॉलर को कंटेनर-आकार बदलते हैं।

0
#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string s;//string is defined here. 

    cout << "Please enter a string with punctuation's: " << endl;//Asking for users input 

    getline(cin, s);//reads in a single string one line at a time 

/* ERROR Check: The loop didn't run at first because a semi-colon was placed at the end 
       of the statement. Remember not to add it for loops. */ 
     for(auto &c : s) //loop checks every character 
     {  
      if (ispunct(c)) //to see if its a punctuation 
       { 
       c=' ';  //if so it replaces it with a blank space.(delete) 
       } 

     } 

     cout << s << endl; 


    system("pause"); 
    return 0; 
    } 
0

एक और तरीका है कि आप ऐसा कर सकता है इस प्रकार होगा:

#include <ctype.h> //needed for ispunct() 
string onlyLetters(string str){ 
    string retStr = ""; 

    for(int i = 0; i < str.length(); i++){ 
     if(!ispunct(str[i])){ 
      retStr += str[i]; 
     } 
    } 
    return retStr; 

यह एक नया स्ट्रिंग बनाने के बजाय वास्तव में पुराने स्ट्रिंग से पात्रों को मिटाकर समाप्त होता है, लेकिन यह एक छोटे से आसान है कार्यों में से कुछ जटिल जटिलताओं का उपयोग करने के बजाय अपने सिर को लपेटें।

0

इस का उपयोग करने का प्रयास करें, यह टेक्स्ट फ़ाइल में स्ट्रिंग पर सभी विराम चिह्न को हटा देगा। str.erase (remove_if (str.begin(), str.end(), :: ispunct), str.end());

कृपया उत्तर दें अगर

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