كيف يمكنني تشغيل برنامج باستخدام getchar؟

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

  •  18-09-2019
  •  | 
  •  

سؤال

أنا إجمالي C n00b أحاول تعليم نفسي C خارج K&R.سؤالي هو نوع من الابتدائي بشكل محرج.حسنًا، إليك ما يلي:لا يمكنني الحصول على برامج تستخدم getchar لإعطاء نوع المخرجات التي كنت أتوقعها.إذا كان لديك K&R في متناول اليد، فأنا عالق في التمرين 1.13.السؤال هو: "اكتب برنامجًا لطباعة رسم بياني لأطوال الكلمات في مدخلاته."ولا أستطيع حتى التعامل مع الإصدار الأفقي بسبب هذه المشكلة التي أواجهها.

أنا أستخدم نظام XP باستخدام Dev-C++ (مترجم mingW) وأقوم بتشغيل البرامج من سطر الأوامر.مشكلتي هي أنه عندما أحاول تشغيل برنامجي، فإنه ينتظر إدخال الأحرف للمسح منها، ولكن عندما أنتهي من الإدخال وأضغط على Enter، لا يحدث ذلك أي شئ.أتوقع أن يمضي قدمًا ويطبع الرسم البياني كما توقعت.في الواقع، لا يبدو أنه يحسب أطوال الكلمات، لأنه كما ترون في الكود، عندما أحاول طباعة ما هو موجود في مصفوفة CTR فقط لمعرفة ما إذا كان يحتوي على أي شيء، لا تتم طباعة أي شيء.

أنا n00b لدرجة أنني ليس لدي أي فكرة عما إذا كان الخطأ هو الكود الخاص بي أو سطر الأوامر.لكنني أظن أن الأمر يتعلق بالنظام، لأنه عندما أحاول التجميع والتشغيل برنامج نموذجي, يحدث نفس الشيء.اكتب الإدخال، ثم اضغط على Enter، ولن يحدث شيء.إذا قمت بالضغط على Ctrl-C، أحيانًا تظهر علامة نجمية أو اثنتين لا تشبه مخرجات النموذج.وفي أحيان أخرى، لا يفعل أي شيء (فقط يعود مباشرة إلى الموجه).

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

ولدي أيضًا سؤال آخر حول البرنامج النموذجي الذي ذكرته أعلاه، ولكن أعتقد أنه يجب علي نشره في سؤال خاص به.شكرا لكم جميعا :)

#include <stdio.h>

//#define 1 IN
//#define 0 OUT
int main () {
    //start w/ state = OUT
    int c = 0;
//    int state = OUT;
    int len = 0;
    int ctr[12];
    int i, j;
    i = j = 0;

    for (i = 0; i <12; i++)
        ctr[i] = 0;
    while ((c = getchar()) != EOF)
       if (c != ' ' && c != '\t' && c != '\n') {
//            state = IN;
            len++;
            printf("%d", len);
            }
       else {
            ctr[len]++;
            len = 0;
            }            
    for (i = 0; i <12; i++) 
        printf("%d\n", ctr[i]);
    for (i = 0; i <12; i++) {
        printf("%d\n", i);   
        for (j = 0; j <= ctr[i]; j++)
            printf("-");
        printf("\n");
        }
    return 0;
}
هل كانت مفيدة؟

المحلول

في حين أن حلقة الخاص بك هي تبحث عن eof والتي تقف على نهاية الملف، وليس نهاية الخط.

على Windows، تحتاج إلى كتابة CTRL-Z لمحاكاة نهاية الملف.

نصائح أخرى

لا يبدو أنك تقوم بالفعل بتخزين c (مدخلاتك) في أي مكان ...ولا طباعته.أنت تقوم بطباعة حجم السلسلة، ولكن ليس الأحرف الفعلية.إذا قمت بـ ctr[i] = c;في مكان ما (حيث تقوم بإضافة الحرف إلى المصفوفة)، ثم قم بطباعة المصفوفة، وسترى مدخلاتك.أوه ونعم، الإجابة عن ctrl-z مهمة أيضًا.أيضًا، إذا كنت جديدًا تمامًا على اللغة، فإنني أحثك ​​بشدة على وضع قوسين حول المحتوى الخاص بك.سوف يستغرق الأمر بعض الوقت قبل أن تتمكن من إلقاء نظرة سريعة على الكود ومعرفة ما الذي يقع ضمن نطاق حلقة while وما الذي لن يقع إذا لم يكن لديك أقواس حولها.

لم أر أي شيء خاطئ حقا في الكود، لذلك قمت بتحميله بموجب دول مجلس التعاون الخليجي، ويبدو أنه يعمل بشكل جيد، طالما تتذكر أنه يجب عليك وضعه في EOF (CTRL-D) لإنهاء الحلقة أثناء الحلقة. دخلت 4 أسطر وأرغب في اتخاذ أي بيانات حول صحة الإجابات، في كل مرة تضغط فيها، حصلت على سلسلة من الأرقام المساوية لعدد الأحرف التي أدخلتها، تليها مساحة. هذا هو بالضبط ما يقوله الكود الخاص بك للقيام به.

عندما دخلت CTRL-D، حصلت على معلومات الموجز. مرة أخرى، لن أقدم أي بيانات حول صحة الإخراج، لكنني حصلت على قسمين رئيسيين كما هو موضح في التعليمات البرمجية الخاصة بك.

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