المشكلة مع scanf في الكسوف / MiniGW
سؤال
أحاول تشغيل التعليمات البرمجية التالية في الكسوف ولكن وحدة تبقى فارغة حتى لا يتوقف البرنامج في مرحلة الإخراج "أدخل القيمة التالية (<=0 الإقلاع)2130567168 دقائق 35509452 ساعات, 48 دقائق." تتكرر مرارا وتكرارا.
يبدو أن scanf هو وضع بعض القيمة الافتراضية في لسبب ما...لا يمكن معرفة السبب.أنا لا أرى أي شيء قبل البرنامج توقف حتى ظننت أنه قد تضطر الى القيام به مع printf لا يتم مسح ، ولكن أنا على يقين من أن استخدام لإجبار دافق.
أي أفكار ؟
#include <stdio.h>
const int MIN_PER_HOUR = 60; // minutes per hour
int main(void)
{
int hour, min, left;
printf("Convert minutes to hours and minutes!\n");
printf("Enter the number of minutes (<=0 to Quit):\n");
scanf("%d", &min); // read number of minutes
while(min > 0){
hour = min / MIN_PER_HOUR; // truncated number of hours
left = min % MIN_PER_HOUR; // number of minutes left over
printf("%d minutes is %d hours, %d minutes.\n", min, hour, left);
printf("Enter next value (<=0 to quit)");
scanf("%d", &min);
}
printf("Done!\n");
return 0;
}
المحلول
قد يكون محاكي Eclipse الطرفي مختلفا ويقوم بمزيد من التخزين المؤقت. حاول الاتصال fflush(stdout);
بين النسخة المطبوعة والمكالمة إلى scanf()
.
نصائح أخرى
نقلت التعليمات البرمجية إلى Visual C ++ وهي تعمل كما هو متوقع. أعتقد أن أسئلتي يجب أن تكون: "لماذا هو محاكاة المحطة في الكسوف مكسور؟"
إذا كان هناك حرف غير صالح لتمثيل الأعداد الصحيحة في المدخلات scanf()
, الدالة سوف تتوقف عند هذا الطابع ، تركها في المخزن المؤقت ، استعداد لقراءتها مرة أخرى و مرة أخرى ومرة أخرى ...
لنفترض أنك دخلت "14 دقيقة" ، scanf()
.وظيفة يقرأ "14" وتوقف في الفضاء.ثم يقوم بتعيين 14 إلى متغير min
و يستمر البرنامج.
ثم داخل حلقة البرنامج ينفذ آخر scanf()
.هذه المرة مخزن الإدخال المؤقت بالفعل أشياء وهي "دقيقة" مع الفضاء. scanf()
قراءة و تجاهل الفضاء, العثور على 'م' الذي لا يمكن تحويل إلى عدد صحيح و وقف دون إسناد قيمة جديدة إلى متغير min
و إرجاع قيمة من 0
.و مرة أخرى ...و مرة أخرى ...و مرة أخرى.
لذلك ما عليك القيام به هو لمسح مخزن الإدخال المؤقت بعد كل scanf()
.
كم هل هذا واضح ؟
ربما بقدر أدخل-الذي هو عن نفسه fgets()
لا :)
على سبيل المثال:
int ch;
scanf("%d", &min);
do { ch = getchar(); } while (ch != '\n'); /* empty buffer */