سؤال

لقد بدأت القراءة "لغة البرمجة C"(K&R) و لدي شك حول getchar() وظيفة.

على سبيل المثال هذا الكود:

#include <stdio.h>

main()
{
  int c;

  c = getchar();
  putchar(c);
  printf("\n");   
}

الكتابة toomanychars + CTRL+D (EOF) يطبع فقط t.أعتقد أن هذا كان متوقعا منذ أول حرف عرض.

لكن هذه قطعة من التعليمات البرمجية:

#include <stdio.h>

main()
{
  int c;

  while((c = getchar()) != EOF) 
    putchar(c);
}

الكتابة toomanychars + CTRL+D (EOF) يطبع toomanychars.

سؤالي هو لماذا يحدث هذا إلا إذا كنت قد شار واحد متغير ؟ أين بقية الأحرف المخزنة ؟

تحرير:

شكرا للجميع الأجوبة أبدأ في الحصول عليه الآن...الصيد واحد فقط:

البرنامج الأول مخارج عندما تعطى CTRL+D في حين أن الثاني يطبع السلسلة بأكملها ثم ينتظر المزيد من إدخال المستخدم.لماذا ينتظر سلسلة أخرى و لا خروج مثل أول ؟

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

المحلول

إنه علاج دفق الإدخال مثل الملف.يبدو الأمر كما لو كنت فتحت الملف الذي يحتوي على النص "toomanychars" و قراءة أو أنتج ذلك حرف واحد في وقت واحد.

في المثال الأول ، في غياب حلقة في حين كأنك فتحت الملف و قراءة الحرف الأول ثم أنتج ذلك.ومع ذلك المثال الثاني سوف تستمر في قراءة الشخصيات حتى يحصل على نهاية الملف إشارة (ctrl+D في هذه الحالة) مثل إذا كانت القراءة من الملف على القرص.


في الرد على تحديث السؤال: ما هو نظام التشغيل الذي تستخدمه ؟ ركضت على بلدي ويندوز XP أجهزة الكمبيوتر المحمول وانها عملت بشكل جيد.إذا كنت هاهنا ، فإنه طباعة ما لدي حتى الآن ، جعل خط جديد ثم يستمر.(إن getchar() وظيفة لا عودة حتى اضغط enter, وهو عندما لا يوجد شيء في مخزن الإدخال المؤقت عندما دعا).عندما اضغط على CTRL+Z (EOF في نظام التشغيل Windows), برنامج إنهاء.علما أنه في ويندوز ، EOF يجب أن تكون على خط من تلقاء نفسها إلى الاعتماد باعتبارها EOF في موجه الأوامر.أنا لا أعرف إذا كان هذا السلوك هو تحاكي في لينكس أو أي نظام قد تكون قيد التشغيل.

نصائح أخرى

getchar يحصل على حرف واحد من اللغة الفصحى ، وهو في هذه الحالة هو المخزن المؤقت لوحة المفاتيح.

في المثال الثاني ، getchar وظيفة في while الحلقة التي تستمر حتى واجه EOF, حتى أنها سوف تبقي حلقات واسترجاع حرف (و طباعة حرف على الشاشة) حتى الإدخال يصبح فارغا.

المتعاقبة المكالمات getchar سوف تحصل على الأحرف المتتالية التي تأتي من المدخلات.

لا تشعر بأنها سيئة عن هذا السؤال -- كنت في حيرة عندما كنت أول من واجه هذه المشكلة أيضا.

شيء هنا هو مخزنة.على سبيل المثالفإن المعياري الملف* الذي putchar يكتب قد يكون خط.مخزنة.عندما ينتهي البرنامج(أو لقاءات السطر) هذا الملف* سيتم fflush()'اد و سترى الإخراج.

في بعض الحالات الفعلية محطة تقرأها قد المخزن المؤقت الإخراج حتى السطر أو حتى المحطة نفسها أمرت أن تدفق انها العازلة, التي قد تكون القضية الحالية المقدمة إنهاء البرنامج sincei أنه يريد أن يقدم جديدا موجه.

الآن, ما هو من المحتمل أن تكون الحالة الفعلية هنا ، هو أنه المدخلات التي يتم تخزينها مؤقتا(بالإضافة إلى الإخراج :-) ) عند الضغط على المفاتيح سوف تظهر في نافذة محطة الخاص بك.إلا أن المحطة لن يرسل تلك الشخصيات إلى التطبيق الخاص بك, وسوف العازلة حتى يمكنك إرشاد إلى نهاية الإدخال مع Ctrl+D ، وربما السطر كذلك.وهنا نسخة أخرى للعب حولها و التأمل حول:

int main() {
  int c;
   while((c = getchar()) != EOF) {
     if(c != '\n')
        putchar(c);
   }
    return 0;
}

محاولة تغذية البرنامج الجملة ، واضغط على Enter.و تفعل الشيء نفسه إذا كنت التعليق الخروج إذا(ج != ' ') ربما يمكنك تحديد ما إذا كان إدخال أو إخراج أو كلاهما مخزنة في بعض الطريق.هذا يصبح أكثر إثارة للاهتمام إذا كنت تشغيل أعلاه مثل:./mytest | ./mytest

(كما sidecomment ، علما أن CTRD+D لا حرف ولا EOF.ولكن في بعض الأنظمة سوف يؤدي إغلاق تيار الإدخال والتي مرة أخرى سوف يرفع EOF أن أي شخص يحاول قراءة من تيار.)

البرنامج الأول الخاص بك فقط يقرأ حرف واحد, يطبع بها ، و المخارج.الثاني برنامج حلقة.فإنه يحتفظ القراءة الشخصيات في وقت واحد و الطباعة بها حتى يقرأ EOF حرف.حرف واحد فقط يتم تخزينها في أي وقت.

كنت فقط باستخدام متغير c تحتوي على كل حرف واحد في وقت واحد.

بمجرد عرض أول شار (t) باستخدام putchar(c), ، يمكنك نسيان قيمة c عن طريق تعيين الحرف التالي (o) إلى متغير c, استبدال القيمة السابقة (t).

رمز وظيفيا أي ما يعادل

main(){
  int c;
  c = getchar();
  while(c != EOF) {
    putchar(c);
    c = getchar();
  }
}

قد تجد هذا الإصدار أسهل للفهم.السبب الوحيد لوضع المهمة في المشروط هو تجنب الحاجة إلى نوع 'c=getchar()' مرتين.

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

بينما في الثانية رمز getchar و putchar موجودة داخل حلقة while.في هذا البرنامج يحافظ على قراءة حرفا واحدا تلو الآخر (كما هو مصنوع من حلقة) حتى تصل إلى تصل إلى EOF حرف (^د).في هذه النقطة ، يطابق ج!=EOF و منذ الشروط هو غير راض ، ومن يخرج من الحلقة.الآن لا يوجد المزيد من البيانات إلى تنفيذ.وبالتالي فإن البرنامج تنتهي عند هذه النقطة.

ويساعد هذا الأمل.

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