سؤال

أعلم أن هذا قد يكون سؤالا مبتدئا تماما (لم أطرق ج منذ فترة طويلة)، ولكن هل يمكن لأي شخص أن يقول لي لماذا هذا لا يعمل؟

printf("Enter command: ");
bzero(buffer,256);
fgets(buffer,255,stdin);

if (strcmp(buffer, "exit") == 0)
    return 0;

إذا أدخلت "الخروج"، فلا تدخل إذا، هل يجب أن تفعل مع طول "المخزن المؤقت"؟

أي اقتراحات؟

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

المحلول

تريد القيام بذلك:

strcmp(buffer, "exit\n")

هذا هو، عند إدخال السلسلة الخاصة بك واضغط على "ENTER"، يصبح الخط الجديد جزءا من buffer.

بالتناوب، استخدم strncmp ()، والتي تقارن فقط أحرف n من السلسلة

نصائح أخرى

FENTS () يعود السلسلة "Exit n" - على عكس Gets ()، فإنه يحافظ على خطوط نيو هناك.

كما قال آخرون، مقارنة مع "exit" فشل بسبب fgets() وشملت نيولاين في المخزن المؤقت. أحد ضماناتها هو أن المخزن المؤقت سينتهي بنظام نيوسرين، ما لم يكن السطر الذي تم إدخاله طويلا للغاية بالنسبة للموسيقى المخزن المؤقت، وفي هذه الحالة لا ينتهي بحدودي جديد. fgets() أيضا ضمان أن المخزن المؤقت انتهت، لذلك لا تحتاج إلى صفر 256 بايت ولكن السماح فقط fgets() استخدم 255 للحصول على هذا الضمان.

الجواب السهل للمقارنة بالضبط "exit\n" مطلوب أن المستخدم لم يضيف بطريق الخطأ مسافة بيضاء قبل أو بعد الكلمة. قد لا يهم ذلك إذا كنت ترغب في إجبار المستخدم على أن تكون حذرا مع خروج الأمر، ولكن قد يكون مصدر إزعاج المستخدم بشكل عام.

استخدام strncmp() يحتمل أن يسمح "exited", "exit42", ، وأكثر لمباراة حيث قد لا تريدهم. قد يعمل ذلك ضدك، خاصة إذا كانت بعض الأوامر صالحة هي سلاسل بادئة أوامر صالحة أخرى.

في الحالة العامة، غالبا ما تكون فكرة جيدة لفصل الإدخال / الإخراج، والتحسينات، والتحليل، والاتخاذ إجراءات في مراحلها الخاصة.

أتفق مع ديف. أيضا قد ترغب في استخدام strncmp () بدلا من ذلك. ثم يمكنك تعيين طول للمقارنة.

http://www.cplusplus.com/Reference/Clibrary/cstdio/fgets/

http://www.cplusplus.com/Reference/Clibrary/cString/strncmp/

أوصي بأن تقوم بتجريت n من نهاية السلسلة، مثل هذا.

شار بوف [256]؛ int len؛ / * احصل على السلسلة، تأكد من مغادرة مساحة لبايت NULL * / IF (FENTS (BUF، Sizeof (BUF) - 1) == EOF) {printf ("خطأ  n")؛ الخروج (1)؛ } / * * دائما لا تنتهي تماما، الطريقة السهلة * / buf [sizeof (buf) - 1] = ' 0'؛ / * حساب الطول، واقتطع  n إذا أي * / لين = strlen (buf)؛ بينما (len> 0 && buf [len - 1] == ' n') {buf [len - 1] = ' 0'؛ - }

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

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