نظرة خاطفة على مخزن الإدخال المؤقت، وطرد الأحرف الزائدة في C

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

  •  20-08-2019
  •  | 
  •  

سؤال

إذا أريد للحصول على إدخال حرف واحد في C، كيف لي أن تحقق لمعرفة ما إذا تم إرسال الأحرف الزائدة، وإذا كان الأمر كذلك، كيف يمكنني مسح ذلك؟

هل هناك وظيفة الذي يعمل مثل getc (ستدين)، ولكن الذي لا يطالب المستخدم لإدخال حرف، حتى أستطيع أن وضعت للتو while(getc(stdin)!=EOF);؟ أو وظيفة لنظرة خاطفة على الحرف التالي في المخزن المؤقت، وإذا كان لا يقوم بإرجاع NULL (أو أيا كان سيكون هناك)، ويمكنني أن استدعاء دالة (نوثر) التي تمسح ستدين؟

تحرير

وحتى الآن، يبدو scanf أن تفعل خدعة ولكن هناك طريقة للحصول عليه لقراءة <ط> كاملة سلسلة، حتى في السطر الجديد؟ بدلا من أقرب المسافات؟ أعرف أنني أستطيع أن مجرد وضع "٪ ق٪ ق٪ الصورة" أو أيا كان في سلسلة التنسيق ولكن يمكنني التعامل مع عدد التعسفي من المساحات؟

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

المحلول

وأنت لا يمكن أن تدفق تيار الإدخال. وسوف يتم استدعاء سلوك غير معرف إذا قمت بذلك. أفضل رهان هو أن تفعل:

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

لاستخدام السحر scanf:

#include <stdio.h>
#include <stdlib.h> 

#define str(s) #s
#define xstr(s) str(s)
#define BUFSZ 256

int main() {
  char buf[ BUFSZ + 1 ];
  int rc = scanf("%" xstr(BUFSZ) "[^\n]%*[^\n]", buf);
  if (!feof(stdin)) {
    getchar();
  }
  while (rc == 1) {
    printf("Your string is: %s\n", array);
    fflush(stdout);
    rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", array);
    if (!feof(stdin)) {
        getchar();
    }
   }
   return 0;
}

نصائح أخرى

ويمكنك استخدام getline لقراءة خط كامل من المدخلات.

وبدلا من ذلك (ردا على السؤال الأصلي الخاص بك)، يمكنك الاتصال select أو poll على ستدين لمعرفة ما إذا كان هناك شخصيات إضافية للقراءة.

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

وأنا أكتب روتين التي تحتاج للحصول على حرف واحد من لوحة المفاتيح، وأنه يحتاج إلى أن يكون واحدا من ثلاثة ضربات المفاتيح الخاصة (أ '1'، وهو '2'، أو '3'). إذا لم تكن واحدة من تلك، يحتاج البرنامج إلى إرسال ورسالة خطأ وحلقة العودة لمحاولة أخرى.

والمشكلة هي أنه بالإضافة إلى الحرف أنا أدخل إعادتهم من قبل getchar ()، يتم حفظ 'أدخل' ضغطة (الذي يرسل ضغط المفاتيح للبرنامج) في مخزن الإدخال المؤقت. ثم يتم إرجاع هذا (غير المطبوعة) حرف السطر الجديد من قبل مرفق getchar () في حلقة تصحيح الخطأ، مما أدى أبعد من ذلك في رسالة الخطأ الثاني (منذ حرف السطر الجديد ليست إما '1'، وهو '2' ، ولا "3").

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

وليس باردا.

ما يبدو أنها ثابتة، رغم ذلك، هو ما يلي:

c = getchar();  // get first char in line
while(getchar() != '\n') ; // discard rest of buffer

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

ونحن يمكن أن تجعل وظيفة لمسح المخزن المؤقت لوحة المفاتيح، مثل هذا:

#include <stdio.h>

void clear_buffer(){
   char b;
   //this loop take character by character in the keyboard buffer using 
   //getchar() function, it stop when the variable "b" was
   //enter key or EOF.
   while (((b = getchar()) != '\n') && (b != EOF));
}

int main()
{
    char input;
    //get the input. supposed to be one char!
    scanf("%c", &input); 
    //call the clearing function that clear the buffer of the keyboard 
    clear_buffer(); 
    printf("%c\n",input); //print out the first character input
    // to make sure that our function work fine, we have to get the
    // input into the "input" char variable one more time
    scanf("%c", &input); 
    clear_buffer();  
    printf("%c\n",input);
    return 0;
}

استخدم قراءة من شأنها أن تأخذ الكثير من الشخصيات (أكثر من 1، ربما 256)، ونرى كيف العديد منهم عاد فعلا. اذا كان لديك أكثر من واحد، كما تعلمون، اذا كان لديك واحد فقط، هذا كل شيء كان هناك المتاحة.

وأنت لا تذكر منصة، وهذا يحصل صعبة للغاية بسرعة كبيرة. على سبيل المثال، على يونيكس (لينكس)، فإن آلية طبيعية إرجاع خط البيانات - وربما حرف واحد كنت بعد وسطر جديد. أو ربما كنت إقناع المستخدم لكتابة ^ D (الافتراضي) لإرسال الحرف السابق. أو ربما كنت تستخدم وظائف التحكم لوضع محطة في وضع الخام (مثل برامج مثل vi وemacs تفعل).

في ويندوز، وأنا لست متأكدا من ذلك - وأعتقد أن هناك وظيفة getch() أن يفعل ما تحتاجه

.

لماذا لا يتم استخدام scanf بدلا من getc، باستخدام scanf ش يمكن الحصول على السلسلة بأكملها.

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