أي ما يعادل Windows getch() لتعطل نظام التشغيل Mac/Linux

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

  •  06-07-2019
  •  | 
  •  

سؤال

انا استخدم getch() ويتعطل تطبيقي على الفور.بما في ذلك عند القيام:

int main()
{
    getch();
}

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

قيل لي أن استخدم std::cin.get(), ، ولكني أرغب في إنهاء التطبيق عند الضغط على أحد المفاتيح، وليس عندما يكتب المستخدم حرفًا أو رقمًا ثم يضغط على Enter للخروج.

هل هناك أي وظيفة لهذا؟يجب أن يعمل الرمز ضمن نظامي التشغيل Mac (نظام التشغيل الخاص بي) وWindows.


الربط/التجميع ليس مشكلة;أنا أشمل <curses.h> والارتباط مع -lcurses في XCode، بينما يستخدم Windows <conio.h>.

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

المحلول

هل بحثت في <curses.h> لنرى ما يفعل وظيفة getch()؟

وتلميح: OSX وينكس ليست هي نفسها ويندوز

.

وعلى وجه التحديد، كما ماكرو في <curses.h>، نجد:

#define getch() wgetch(stdscr)

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

و(تلميح جيد من dmckee - أنه ساعد على خط الارتباط من acidzombie24، وهذا أمر مهم.)

لنصل الى نقطة حيث في المخ مفتاح واحد يمكن قراءة وبرنامج إنهاء نظيفة، ما عليك القيام به قدرا كبيرا من العمل على يونكس (OSX، لينكس). سيكون لديك اعتراض على الحالة الأولية للمحطة، وترتيب لوظيفة atexit() - أو آلية مماثلة - لاستعادة الدولة من المحطة، وتغيير محطة من وضع المطبوخة في وضع الخام، ثم استدعاء وظيفة لقراءة حرف ( ربما فقط read(0, &c, 1))، والقيام خروج الخاص. قد تكون هناك طرق أخرى للقيام بذلك - ولكن من المؤكد أنها سوف تنطوي على بعض عمليات إعداد والإنهاء

وكتاب واحد يمكن أن يساعد هو المتقدم يونكس البرمجة، 2 EDN بواسطة علامة Rochkind. ويغطي التعامل مع الركاب في المستوى المطلوب. بدلا من ذلك، يمكنك استخدام <curses.h> صحيح - من شأنها أن تكون أكثر بساطة من حل لفة الخاص بك الخاصة، وربما أكثر موثوقية

نصائح أخرى

ولقد لا معارضها

#include <stdio.h>

أو

#include <curses.h>

وأو خط مماثل. هل أنت متأكد من أنك ربط ضد مكتبة <م> يتضمن getch()؟

استخدم الدالة cin.get() على سبيل المثال:

#include <iostream>

using namespace std;

int main()
{
  char input = cin.get();

  cout << "You Pressed: " << input;
}

سينتظر البرنامج بعد ذلك الضغط على المفتاح.

وبمجرد الانتهاء من ذلك، سيتم طباعة المفتاح الذي ضغطت عليه على الشاشة.

وظيفة getch لا تتوفر على أنظمة يونكس مثل، ولكن يمكنك استبدالها الأوامر وحدة التحكم من خلال المترجم الخاص بك مع وظيفة system.

والاستعمال:

في ويندوز يمكنك استخدام system("pause");

في أنظمة يونكس مثل (مثل OSX) يمكنك استخدام system("read -n1 -p ' ' key");

ملحوظة: أعلن system في <stdlib.h>

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