سؤال

هذا هو نسختي من Detab، من هذه الرياضة K & R:

تعديل Detab لقبول قائمة علامات التبويب تتوقف كحجج. استخدم إعداد علامة التبويب الافتراضي إذا لم تكن هناك حجج.

#include <stdio.h>
#include <stdlib.h>
#define TAB_STOP 8

/* replaces tabs from input with the proper amount of blank spots */
int Detab()
{
     int c, x;
     int column;
     x = column = 0;

     while((c=getchar())!=EOF)
     {
        if(c == '\n') /* reseting counter if newline */
        {
            putchar(c);
            return 1;
        }
        else if(c!='\t')  /* column counts places to tab spot */
        { 
             putchar(c);
             column++; 

             if(column == TAB_STOP) 
             column = 0;
        }
        else /* tab */
        {
           for(x=0; x<TAB_STOP - column; x++)
           putchar('_');

           column = 0;
        } 
     }
     return 0;
}
int main(int argc, char *argv[])
{
     int valid;

     while((valid=Detab())!=0);

     printf("Press any key to continue.\n");
     getchar();
     return 0;
}

سؤالي هو إذا كان هناك المزيد من الحجة واحدة - على سبيل المثال 5، 8، 10-متى تتوقف علامة التبويب التالية عن المفترض أن نبدأ النشاط؟ عند أي نقطة يجب أن يبدأ البرنامج باستخدام tab_stop 8 بدلا من البدء 5؟ بعد خط جديد أو كيف يجب أن أفعل هذا؟

أنا أيضا لست متأكدا مما إذا كان يجب علي وضع كل هذا في الرئيسية، أو يجب أن ألتصق بوظيفة منفصلة؟

تحرير: حسنا هذا ما حاولت.

#define MAX_ARGUMENTS 100
int main(int argc, char *argv[])
{
     int i, val = 0;
     int nums[MAX_ARGUMENTS];
     int x = 0;

     for(i = 1; i < argc; i++) {

           while(isdigit(*argv[i])) {
             val = val * 10 + *argv[i] - '0';
             *++argv[i];
           }

           nums[x++] = val;
           val = 0;

     }

     Detab(nums);       


     printf("Press any key to continue.\n");
     getchar();
     return 0;
}

هل أنا على الطريق الصحيح؟ يمكن لهذا العمل؟ ما زلت لم أعد تعديل detab.

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

المحلول

سأرجم tabstop 5 8 10 ليعني وجود علامة تبويب في 5ذ, 8ذ, و 10.ذ الأعمدة (وبعد ذلك، كل ثلاثة أعمدة، أو ما تستخدمه كإعداد افتراضي. إنه مفتوح في السؤال عما إذا كان يجب أن يكون علامة التبويب التالية بعد العمود 10 في العمود 18 (8 مسافات في وقت لاحق) أو 16 (المضاعف التالي من الافتراضي 8).

نصائح أخرى

تحدد قائمة Stab Stabs أعمدة معينة، وليس المسافات بين التوقف. وهذا هو، إذا كانت القائمة هي 5،8،10، فعليها علامة تبويب في المواقف 1-4 وضع المؤشر في 5، في المراكز 5-7 يجب أن تضع المؤشر في 8، و 8-9 ضع المؤشر في 10. بعد كل عنوان NEWLINE يجب أن تبدأ قائمة الوسائط من خلال علامة التبويب الأولى مرة أخرى. السلوك على خط بعد توقف علامة التبويب الأخيرة المحددة هو متروك لك، عادة ما ستعود إلى الفاصل الزمني لإيقاف علامة التبويب الافتراضي.

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

على سبيل المثال، إذا تم توفير [5، 8، 10] والافتراضي هو 8، وسوف تستمر كما [5، 8، 10، 18، 26، 34، ...] أو [5، 8، 10، 16، 16، 24، 32، ...]، اعتمادا على التفضيل.

لاحظ أنني أستخدم هذه الأرقام كما علامة التبويب توقف, ، بدلا من عرض. وبعد لذلك [5، 8] يعني أن المحطة الأولى هي في 5 مع العرض 5، والثاني في 8 مع العرض 3.

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