تجاهل إرجاع النقل في SCANF قبل البيانات ... للحفاظ على تخطيط الرسومات المستندة إلى وحدة التحكم مع conio.h

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

سؤال

لدي مصيبة لاستخدام Conio.h في VC ++ 6 للحصول على مهمة جامعية،

مشكلتي هي أن إعداد الرسومات الخاص بي موجود في وسط الشاشة ...

على سبيل المثال

gotoxy( getcols()/2, getrows()/2);
printf("Enter something");
scanf( "%d", &something );  

الآن إذا كان شخص ما يضرب بطريق الخطأ أدخل قبل إدخال "شيء ما"، فسيتم إعادة تعيين المؤشر إلى يسار الشاشة في السطر التالي.

حاول IV Flushing لوحة المفاتيح والمخازن المؤقتة BIOS مع Fflush (Stdin) و GetChar ()، والتي كنت تريد أن تعمل!

أي مساعدة / أفكار موضع تقدير، شكرا، الخامس

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

المحلول

سيتضمن الطريق إلى النجاح القيام بما يطلب منك التعيين القيام به :) على وجه الخصوص، يجب عليك استخدام وظائف واحدة أو أكثر من conio.h لقراءة المدخلات الخاصة بك. scanf() هو ليس وظيفة conio.h.

لان أنا كسول هذا سؤال الواجبات المنزلية، لن أكتب التعليمات البرمجية لك.

يمكن أن يكون أحد الاحتمالات للاستخدام cscanf() عوضا عن scanf(). وبعد لكن هذا مايو (لا أعرف) شخصيات الإدخال صدى، والتي ستضم ذلك عرضي يدخل, ، وليس حل مشكلتك.

إذا كانت هذه هي الحالة، فستكون استراتيجيتي هي كتابة حلقة لجمع الأحرف التي تم إدخالها من لوحة المفاتيح، باستخدام غير تردد getch() وظيفة. يمكنك تجاهل Newlines حتى يكون لديك حرف قابل للطبيب واحد على الأقل، ثم قبول الأحرف (وتخزينها في صفيف حرف أو أيا كان) حتى تحصل على خط جديد. نظرا لأن أحرف الإدخال لن يرددا، أعتقد أن المؤشر لن يتحرك.

يمكنك بعد ذلك مسح أحرف الإدخال من المخزن المؤقت الإدخال الخاص بك باستخدام sscanf(). وبعد سترغب في حساب أحرف الإدخال للتأكد من عدم تجاوز المستخدم الخاص بك المخزن المؤقت الخاص بك. أيضا، ربما بعض التعامل مع الأخطاء في حالة وجود بيانات سيئة.

تعديل: شيء نسيت أن أذكر: يجب اتباع حرف الإدخال الأخير الخاص بك في المخزن المؤقت حرف صفر ( '\0' ) لذا sscanf() سوف ينتهي بشكل صحيح. من الممكن أن يكون المخزن المؤقت الخاص بك مليئا بأصفار الأصفار افتراضيا، لكن وضع واحد في هناك عمدا (على سبيل المثال عندما تضغط على Newline النهائي)، سيجعل رمزك أكثر صحة وقوية.

نصائح أخرى

حاول قراءة إدخال المستخدم حرف واحد في وقت واحد. إذا تم اكتشاف عودة النقل الرائدة، تجاهل الشخصية وتشغيلك gotoxy( getcols()/2, (getrows()/2)+1) الرمز مرة أخرى لإعادة وضع المؤشر في الموقع المناسب (إضافة صف واحد لتجنب الكتابة عبر رسالة الإخراج سابقا).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top