سؤال

عند البرمجة C لوحدة التحكم في الأوامر ، ما يحدث عندما يكون لديك وظيفة تحاول استخدام ScanF لطلب إدخال المستخدم لمتغير char ، وأنواع المستخدمين كنترول+ض (EOF) و THITS ENTER؟

علي سبيل المثال:

char promptChar()
{
    char c;
    printf("Enter a character: ");
    scanf("%c", &c);
    return c;
}

إذا كان المستخدم كنترول+ض والضربات تدخل ، ماذا ستعود orderchar ()؟ لأنه إذا فهمت EOF ، فهذا INT.

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

المحلول

اهم الاشياء اولا:

SCANF لم يتم تعريفها من قبل اللغة.
CHAR لم يتم تعريفها من قبل اللغة.

حسنًا ، مع ذلك من الطريق ...

ال scanf() وظيفة إرجاع عدد صحيح. هذا عدد صحيح هو عدد عناصر الإدخال المخصصة أو قيمة الماكرو EOF إذا حدث فشل في الإدخال قبل التحويل الأول.
لم تتحقق من قيمة الإرجاع scanf() اتصل ، لذلك ليس لديك فكرة عما حدث. قد يكون كل شيء على ما يرام ، أو قد يكون دفق الإدخال قد انتهى قبل التحويل الأول ، أو (وليس ٪ ج) ربما كان هناك فشل في التحويل.

اختبار قيمة الإرجاع scanf(). بالفعل، اختبر دائمًا قيمة الإرجاع للجميعu003Cstdio.h> المهام.

char ch;
int result = scanf("%c", &ch);
if (result == 1) /* all ok */;
else if (result == 0) /* conversion failure: value of `ch` is indeterminate */;
else if (result == EOF) /* input failure; value of `ch` is indeterminate */;

عندما تكون نتيجة scanf() المكالمة EOF, ، إذا كنت تريد المزيد من المعلومات حول سبب فشل الإدخال ، فيمكنك الاستخدام feof() و/أو ferror().

else if (result == EOF) {
    if (feof(stdin)) {
        /* no data in input stream */
    }
    if (ferror(stdin)) {
        /* error if input stream (media ejected? bad sector? ...?)
    }
}

للإجابة على سؤالك: what will promptChar() return?

سوف يعيد قيمة غير محددة من نوع char.
يمكنك اتباع مثال وظيفة المكتبة التي تتعامل مع الأحرف وإرجاع int من promptChar(). ستكون هذه هي قيمة القراءة التي تقرأها unsigned char أو int سلبي (EOF) في حالة الخطأ. اقرأ الوصف ل fgetc(), ، على سبيل المثال.

نصائح أخرى

من Linux scanf(3) manpage:

"القيمة eof يتم إرجاعه في حالة الوصول إلى نهاية الإدخال قبل أول تحويل ناجح أو فشل مطابقة. eof يتم إرجاعه أيضًا في حالة حدوث خطأ في القراءة ، وفي هذه الحالة مؤشر الخطأ للدفق (انظر ferror(3)) تم تعيينه ، ويتم تعيين errno تشير إلى الخطأ. "

لاحظ أن هذا المقطع يتعلق بقيمة إرجاع scanf, وليس معلمات النتيجة.

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

ستعترض معظم قذائف الأوامر بعض أحرف التحكم وتستخدمها لإخبار القشرة للقيام بالأشياء. على سبيل المثال ، غالبًا ما يبدأ Ctrl-S و Ctrl-Q ويوقفون قذيفة أحرف الإخراج. سيتم بالفعل اعتبار Ctrl-Z على بعض الأصداف كقيادة لإغلاق القشرة.

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