سؤال

أحاول تشغيل التعليمات البرمجية التالية في الكسوف ولكن وحدة تبقى فارغة حتى لا يتوقف البرنامج في مرحلة الإخراج "أدخل القيمة التالية (<=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 */
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top