سؤال

أنا مرتبك getchar()دور في التعليمات البرمجية التالية. أعني أنني أعلم أنه يساعدني في رؤية نافذة الإخراج التي لن تكون مغلقة فقط عندما أضغط على يدخل مفتاح.

وبالتالي getchar() في الأساس ينتظرني للضغط على Enter ثم يقرأ حرفا واحدا.

ما هي تلك الشخصية الفردية هذه الوظيفة تقرأ؟ لم أضغط على أي مفتاح من لوحة المفاتيح لقراءة.

الآن عندما لا يقرأ أي شيء، فلماذا لا يعطي خطأ يقول "مهلا، أنت لم تدخل أي شيء من أجلي القراءة"؟

#include <stdio.h>

int main()
{
    printf( "blah \n" );
    getchar();
    return 0;
}
هل كانت مفيدة؟

المحلول

ال getchar() ستنتظر الدالة ببساطة حتى تتلقى شخصية، وعقد البرنامج حتى يفعل ذلك.

يتم إرسال حرف عند الضغط على مفتاح ENTER؛ تحت نظام التشغيل Windows، سترسل عودة النقل (CR) وغذاء خط (LF).

يرى هذا الترميز ما بعد الترميز للحصول على تفسير لطيف بشكل جيد.

(... شرح جزء CR + LF، وليس getchar() منع الجزء)

نصائح أخرى

هذا لأن getchar () هو حظر وظيفة.

يجب أن تقرأ عنه حظر وظائف, ، والتي تجعل العملية أساسا انتظر لشيء ما يحدث.

تنفيذ هذا انتظار يعتمد السلوك على الوظيفة، ولكن عادة ما يحدث حلقة تنتظر حدث بعض الحدث.

لقضية getchar() وظيفة، وربما يتم تنفيذ ذلك كحلقة واحدة تقرأ باستمرار ملف (Stdin لهذه العلبة) والتحقق من الطقس يتم تعديل الملف. إذا تم تعديل الملف، فإن الحلقة تتصرف عن طريق القيام بشيء آخر.

جرب هذا:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char ch;

    printf("I'm now going to block until you press something and then return... ");

    ch = getchar();

    if (ch >= 0)
       printf("\nYou pressed %c\n", ch);
    else
       printf("\nAliens have taken over standard input! Run!\n");

    return 0;
}

getchar() سوف يتسبب في استلام برنامجك للنوم حتى يتم استلام مقاطعة لوحة مفاتيح (أو أي شيء مرتبط بالسعادة). هذا يعني أنه حظر، لن ينفذ أي رمز إضافي حتى getchar() عائدات.

انها جيدة جدا مفيدة للنظر في قيمة الإرجاع وظيفة من أجل فهم ذلك.

أي وظيفة قد تمنع، إلا إذا كانت توفر بعض الآلية لمنع حظر. على سبيل المثال، open() يسمح A. O_NONBLOCK العلم الذي هو مفيد لفتح بطيئ في الرد على الأجهزة مثل أجهزة المودم. باختصار، إذا تم إدخالها من محطة أو يجب أن تنتظر للحصول على إجابة من النواة أو بعض الأجهزة، فهناك فرصة جيدة جدا قد تمنعها.

GetChar () يحظر تنفيذ البرنامج الخاص بك حتى يتم الضغط على المفتاح. لذلك، ليس هناك خطأ إذا لم يتم الضغط على أي مفتاح، فسوف ينتظر GetChar () حتى يحدث ذلك :)

يمكنك معرفة المزيد حول كيف يتصرف getchar هنا:http://www.cppreference.com/wiki/c/io/getchar....وهذا ينبغي أن أجيب على سؤالك:)

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

يرى مناقشة مشكلة الدخول هنا

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