2011-03-31 14 views
7

मैं कंसोल से vector<int> में स्पेस से अलग संख्याओं को पढ़ने का एक आसान काम करने की कोशिश कर रहा हूं, लेकिन मुझे यह ठीक से नहीं करना है।कंसोल से स्पेस से अलग संख्याओं को कैसे पढ़ा जाए?

यह मैं अब तक क्या किया है है:

int n = 0; 
vector<int> steps; 
while(cin>>n) 
{ 
    steps.push_back(n); 
} 

बहरहाल, यह (जैसे a के रूप में) में कोई अमान्य वर्ण while पाश को तोड़ने के लिए दबाने की आवश्यकता है। मुझे यह नहीं चाहिए।

जैसे ही उपयोगकर्ता 0 2 3 4 5 जैसे नंबर दर्ज करता है और Enter दबाता है, मैं लूप को तोड़ना चाहता हूं। मैंने istream_iterator और cin.getline का उपयोग करने का प्रयास किया, लेकिन मैं इसे काम नहीं कर सका।

मुझे नहीं पता कि उपयोगकर्ता कितने तत्व दर्ज करेगा, इसलिए मैं vector का उपयोग कर रहा हूं।

कृपया ऐसा करने का सही तरीका सुझाएं।

उत्तर

11

संख्याओं को निकालने के लिए istringstream के साथ संयुक्त getline का उपयोग करें।

std::string input; 
getline(cin, input); 
std::istringstream iss(input); 
int temp; 
while(iss >> temp) 
{ 
    yourvector.push_back(temp); 
} 
+0

लेकिन उस विधि को स्ट्रीमसाइज़ करने की आवश्यकता है जिसे मैं नहीं जानता। क्या आप नमूना कोड पोस्ट कर सकते हैं? – Asha

+0

ओह्स..ओके, मुझे अब @templatetypedef उदाहरण के साथ मिला है। आप मुफ्त फ़ंक्शन 'geline' का जिक्र कर रहे हैं और' cin.getline' नहीं। – Asha

+0

कोड के साथ संपादित। – jonsca

7

jonsca के जवाब पर विस्तार से बता दें यहाँ, एक संभावना है यह सोचते हैं कि उपयोगकर्ता ईमानदारी से वैध पूर्णांक में प्रवेश करती है:

string input; 
getline(cin, input); 

istringstream parser(input); 
vector<int> numbers; 

numbers.insert(numbers.begin(), 
       istream_iterator<int>(parser), istream_iterator<int>()); 

यह सही ढंग से पढ़ सकते हैं और cin से पूर्णांकों का एक मान्य लाइन विभाजित होगा। ध्यान दें कि यह मुफ्त फ़ंक्शनgetline का उपयोग कर रहा है, जो std::string एस के साथ काम करता है, और istream::getline नहीं, जो सी-स्टाइल स्ट्रिंग के साथ काम करता है।

1

यह कोड आपको मदद कर सकता है, यह एक स्ट्रिंग के लिए एक रेखा पढ़ता है और फिर सभी संख्याओं को प्राप्त करने पर इसे फिर से शुरू करता है।

#include <iostream> 
#include <sstream> 
#include <string> 

int main() { 
    std::string line; 
    std::getline(std::cin, line); 
    std::istringstream in(line, std::istringstream::in); 
    int n; 
    vector<int> v; 
    while (in >> n) { 
     v.push_back(n); 
    } 
    return 0; 
} 
1

प्रत्येक नंबर के बाद प्रॉम्प्ट उपयोगकर्ता या अग्रिम में नंबर गिनती करें और तदनुसार लूप करें। कोई अच्छा विचार नहीं है लेकिन मैंने इसे कई अनुप्रयोगों में देखा है।

1

इसके अलावा, यह जानने में सहायक हो सकता है कि आप अपने इनपुट के साथ समाप्त होने के बाद, कमांड लाइन में एक ईओएफ - प्रेस 'ctrl-z' (केवल विंडोज़, यूनिक्स जैसी प्रणाली ctrl-d) को उत्तेजित कर सकते हैं। जब आप इस तरह के छोटे कार्यक्रमों का परीक्षण कर रहे हों तो आपको मदद करनी चाहिए - अमान्य चरित्र में टाइप किए बिना।

+0

यह यूनिक्स-जैसी प्रणालियों पर Ctrl-d होगा। –

+0

भूल गए 'बोउट कि - ack'd + संपादित। – Schnommus

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