2011-11-23 8 views
11

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

int main() 
{ 
    srand((unsigned)time(0)); 
    string quest1[100], answ1[100]; 
    int size1, x = 0, num, count1, visit[100], shuffle[100]; 
    fstream flashcard1; 

    cout << "flashcard.cpp by NAME\n" << endl; 
    cout << "This program allows user to manipulate questions and answers for studying.\n" << endl; 
    cout << "\nHow many flash cards will be entered(MAX 100)? "; 
    cin >> size1; 
    cout << endl; 

    while(x < size1) 
    { 
     cout << "Enter Question: "; 
     getline(cin , quest1[x]); 
     cout << endl; 
     x = x++; 

     /* 
     cout << "Enter Answer: " << endl; 
     getline(cin,answ1[x]); 
     cout << endl; 
     flashcard1.open("flashcard1.dat", ios::app); 
     flashcard1 << quest1[x] << " " << answ1[x] << endl; 
     flashcard1.close(); 
     cout << "Data Stored." << endl; 
     */ 
    } 
} 

मैं जवाब भाग में प्रवेश करने के साथ ही फाइल करने के लिए बचत डेटा बाहर का उल्लेख किया बस डिबगिंग के लिए। जब मैं प्रोग्राम चलाता हूं तो यह पहले प्रश्न के लिए गेटलाइन को छोड़ देता है, "प्रश्न दर्ज करें" का दूसरा पाश प्रदर्शित करता है और बाकी के लिए गेटलाइन काम करता है। तो अगर मेरे पास 5 का आकार 1 है, तो प्रोग्राम केवल सरणी पदों को 1-4 भर देता है। कृपया मदद करे। यह एक साधारण फ्लैश कार्ड प्रोग्राम है जो वही काम करेगा जैसे कि आप उन्हें पढ़ने और उन्हें घुमाने के लिए फ़्लैश कार्ड बनाना चाहते थे।

+7

'x = x ++;' अपरिभाषित व्यवहार है। यह सिर्फ 'x ++' (या '++ x', या' x + = 1', या 'x = x + 1', या' x - = -1' ....) –

+0

होना चाहिए क्योंकि x ++ और ++ x दोनों अपने मान को 1/में बदलकर एक्स को बदलते हैं। आप इस बात की गारंटी नहीं दे सकते कि असाइनमेंट पहले या उसके बाद होता है, इसलिए बढ़ने से पहले x को x ++ का मान असाइन किया जा सकता है या उसके बाद होता है (मानक सिर्फ यह निर्दिष्ट नहीं करता है)। एसओ पर एक अच्छा पहला प्रश्न के लिए –

+4

+1। –

उत्तर

12

कारण यह पहली यात्रा को छोड़ने के लिए दिखाई दे रहा है है, क्योंकि जब आप

cin >> size1; 

कर आप एक नंबर दर्ज करें और Enter कुंजी दबाएं। cin पूर्णांक को पढ़ता है और बफर पर न्यूलाइन वर्ण को अपठित करता है, ताकि जब आप getline पर कॉल करते हैं, तो ऐसा लगता है कि आप तुरंत एंटर कुंजी दबाते हैं, और getline कुछ भी नहीं पढ़ता है (क्योंकि यह न्यूलाइन कैरेक्टर पढ़ने से पहले बंद हो जाता है), त्याग देता है नई लाइन, और खाली स्ट्रिंग quest1[0] में रखती है। और यही कारण है कि getline के बाकी काम "सही" हैं।

cin.ignore('\n') अपने लूप के ऊपर '\n' से छुटकारा पाने के लिए जोड़ें, और इसे आपके कोड में अन्य त्रुटियों को छोड़कर, इसे कार्य करना चाहिए।

और यूबी से बचने के लिए x = x++ को x++ में बदलने के लिए मत भूलना।

+0

धन्यवाद! मैंने वर्षों में इस तरह के एक सहायक समुदाय का अनुभव नहीं किया है! – Brent

+0

@ ब्रेंट अगर इसने आपके प्रश्न का उत्तर दिया है, तो कृपया अपने प्रश्न के उत्तर के रूप में इसे चिह्नित करने के लिए इसके बगल में स्थित चेकमार्क पर क्लिक करना सुनिश्चित करें। –

+0

मैं क्षमा चाहता हूं।मैंने पहले कक्षा में था और मेरे कार्यक्रम को संपादित नहीं कर सकता है, लेकिन माना जाता है कि यह सही जवाब था। जब मैं अपने पाश से ऊपर cin.ignore ('एन) में कहा, कार्यक्रम सिर्फ कभी नहीं पाश के भीतर पहली अदालत बयान को लाता है enless तुम सिर्फ लगभग आधा दर्जन बार – Brent

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