الأمراض المنقولة جنسيا :: السلوك الغريب stringstream

StackOverflow https://stackoverflow.com/questions/637118

  •  10-07-2019
  •  | 
  •  

سؤال

وبعض المعلومات الأساسية، لديرنج اضطررت لكتابة تدوين آلة حاسبة البولندية باستخدام شجرة ثنائية، لهذا العمل واضطررت الى تحليل المدخلات سطر الأوامر بحيث أنها ستبني صحيح شجرة ثنائية ومن ثم يذهب أكثر من ذلك لإعطاء إجابة صحيحة للتعبير رياضي التي تم إدخالها.

لإعراب أنا استخدم الأمراض المنقولة جنسيا :: stringstream لدرجة أنني سوف تكون قادرة بسهولة على تحويل الأمراض المنقولة جنسيا :: سلسلة وسلم I إلى تعويم صالح (أو صحيحة، انقر نقرا). وكانت القضية ركضت عبر التعليمة البرمجية التالية، والتي لديها خطأ عرضت وكيف تحل هذه القضية. وكنت آمل أن شخصا حيث ستكون قادرة على أن تخبرني إذا كنت تفعل شيئا خاطئا و.clear () غير صحيحة، أو إذا كان هذا هو خلل في المكتبة القياسية في الطريقة التي يعالج هذا مدخل معين (يحدث فقط ل+ و-)

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

int main() {
    std::string mystring("+");
    int num;
    char op;

    std::stringstream iss(mystring);
    iss >> num;

    // Seems it is not a number 
    if (iss.fail()) {
            // This part does not work as you would expect it to

            // We clear the error state of the stringstream
            iss.clear();
            std::cout << "iss fail bit: " << iss.fail() << std::endl;
            iss.get(op);
            std::cout << "op is: " << op << " iss is: " << iss.str() << std::endl;
            std::cout << "iss fail bit: " << iss.fail() << std::endl;

            // This however works as you would expect it to
            std::stringstream oss(iss.str());
            std::cout << "oss fail bit: " << oss.fail() << std::endl;
            oss.get(op);
            std::cout << "op is: " << op << " oss is: " << oss.str() << std::endl;
            std::cout << "oss fail bit: " << oss.fail() << std::endl;

    } else {
            // We got a number
    }   
}

وإخراج نموذج من البرنامج:

iss fail bit: 0
op is:  iss is: +
iss fail bit: 1
oss fail bit: 0
op is: + oss is: +
oss fail bit: 0
سوف

وربما يا رفاق نرى شيئا فاتني، أو إذا كان هذا هو في الواقع أعلى خلل تصل إلى ما بعد برنامجي، التي مؤشرات الحالة إلى أين الإبلاغ عن هذا سيكون موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

وعندما تقول:

  iss.clear();
  std::cout << "iss fail bit: " << iss.fail() << std::endl;
  iss.get(op);

وتحاول قراءة ما تم بالفعل قراءة. تحتاج إلى إعادة تعيين تيارات قراءة المؤشر:

  iss.clear();
  iss.seekg(0);    // start again
  std::cout << "iss fail bit: " << iss.fail() << std::endl;
  iss.get(op);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top