2011-11-19 12 views
5

मैं एक इनपुट इस प्रकार फ़ॉर्मेट किया है के साथ एक स्ट्रिंग पढ़ना:पूर्णांकों के साथ एक लाइन और रिक्त स्थान

पूर्णांक बहु-शब्द-स्ट्रिंग पूर्णांक

मैं अनेक शब्दों की अधिकतम लंबाई पता -स्ट्रिंग, हालांकि मुझे नहीं पता कि इसमें कितने शब्द हैं। मैं इसे कैसे पढ़ सकता हूं?

+0

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

उत्तर

1

पहला पूर्णांक पढ़ें। स्ट्रिंग के पीछे कूदें और अंकों को छोड़ दें। फिर इस बिंदु से एक int पढ़ो। बीच में हिस्सा स्ट्रिंग है। 100% सही नहीं हो सकता है लेकिन:

char buf[256], *t = buf, *p, str[256]; 
fread(buf, 1, 256, file); 
int s,e; 
t += sscanf(buf, "%d", &s); 
*p = buf + strlen(buf); 
while (isdigit(*p)) p--; 
sscanf(p, "%d", &e); 
strncpy(str, p, p - t); 
5

मैं पहले पंक्ति पढ़ता हूं और पहले और अंतिम शब्द को पूर्णांक में परिवर्तित करता हूं। शिथिल:

std::string line; 
std::getline(infile, line); 

size_t ofs_front = line.find(' '); 
size_t ofs_back = line.rfind(' '); 

int front = std::strtol(line.substr(0, ofs_front).c_str(), NULL, 0); 
int back = std::strtol(line.substr(ofs_back).c_str(), NULL, 0); 
std::string text = line.substr(ofs_front, ofs_back - ofs_front); 

आप कुछ संशोधनों के रिक्त स्थान से छुटकारा पाने के करना होगा (जैसे को बढ़ा देते ऑफसेट सभी रिक्त स्थान ऊपर हडप करने के लिए), और आप त्रुटि जाँच के बहुत सारे जोड़ना चाहिए।

आप सभी आंतरिक पाठ के अंदर रिक्त स्थान को सामान्य बनाने में चाहते हैं, तो वहाँ एक और समाधान है स्ट्रिंग धाराओं का इस्तेमाल करके:

std::vector<std::string> tokens; 
{ 
    std::istringstream iss(line); 
    std::string token; 
    while (iss >> token) tokens.push_back(token); 
} 
// process tokens.front() and tokens.back() for the integers, as above 
std::string text = tokens[1]; 
for (std::size_t i = 2; i + 1 < tokens.size(); ++i) text += " " + tokens[i]; 
1

यह @ KerrekSB के solution के रूप में के रूप में कुशल नहीं है, लेकिन एक और तरीका यह करने के लिए पहले पूर्णांक को निकालने के लिए है, फिर शेष स्ट्रिंग के माध्यम से लूप करें जब तक आप दूसरा पूर्णांक नहीं पाते।

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::istringstream ss("100 4 words to discard 200"); 
    int first, second; 
    char buf[1000] = {0}; 

    if(!(ss >> first)) { 
    std::cout << "failed to read first int\n"; 
    return 1; 
    } 

    while(!(ss >> second) || !ss.eof()) { 
    if(ss.eof()) { 
     std::cout << "failed to read second int\n"; 
     return 1; 
    } 
    ss.clear(); 

    if(ss.getline(buf, 1000, ' ').bad()) { 
     std::cout << "error extracting word\n"; 
     return 1; 
    } 
    }  

    std::cout << "first = " << first << "\n"; 
    std::cout << "second = " << second << "\n"; 

    return 0; 
} 
+0

@KerrekSB उन दोनों मामलों को सही ढंग से संभाला जाता है – Praetorian

+0

क्षमा करें, कोई बात नहीं! –

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