Frage

Dies ist meine Version von detab, aus dieser K & R Übung:

  

Ändern detab eine Liste der Register zu akzeptieren stoppt als Argument. Verwenden Sie die Standard-Registerkarte Einstellung, wenn es keine Argumente.

#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;
}

Meine Frage ist, ob es mehr als ein Argument, zum Beispiel 5, 8, 10, wenn die nächste Tabstopp nähme aktiv zu beginnen? An welcher Stelle soll 5 mit TAB_STOP 8 statt das Startprogramm starten? Nach einem Newline oder wie soll ich tun?

Ich bin auch nicht wirklich sicher, ob ich all dies in dem Haupt setzen sollte, oder soll ich mit einer separaten Funktion bleiben?

Edit:. Ok das ist, was ich versuchte,

#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;
}

Bin ich auf dem richtigen Weg? Kann das funktionieren? Ich noch geändert detab havent.

War es hilfreich?

Lösung

Ich würde tabstop 5 8 10 interpretieren es bedeuten, sind Register am 5 stoppt th , 8 th und 10 th Spalten (und danach alle 8 Spalten, oder was auch immer Sie als Standard verwenden. Es ist eine offene Frage, ob die nächste Tabstopp nach Spalte 10 in Spalte 18 sein sollte (8 Räume später) oder 16 (das nächste Vielfache der Standard 8).

Andere Tipps

Eine Liste von Tabstopps gibt bestimmte Spalten, nicht Abstände zwischen den Haltestellen. Das heißt, wenn die Liste 5,8,10 ist dann ein Register in den Positionen 1-4 des Cursors an 5 Stellen sollten, in den Positionen 5-7 des Cursors bei 10 in 8, und 8-9 Setzen Sie den Cursor platzieren sollte Nach jede Newline die Argumentliste aus dem ersten Reiter wieder stoppen anfangen sollte. Das Verhalten in einer Zeile nach dem letzten Stopp definiert Registerkarte liegt an Ihnen, in der Regel würden Sie zu einem gewissen Standard-Tabstopp Intervall zurück.

Sie haben einen gewissen Spielraum hier, wie Sie es sind entwerfen; jedoch ist die beliebteste Methode ist mit der Standardbreite nach der letzten gelieferten Breite fortzusetzen.

Wenn beispielsweise [5, 8, 10] zugeführt wird, und der Standardwert ist 8, wäre es weiterhin als [5, 8, 10, 18, 26, 34, ...] oder [5, 8, 10 , 16, 24, 32, ...], je nach Vorliebe.

Beachten Sie, dass ich verwende diese Zahlen als Tabstopps , anstelle von Breiten . So [5, 8] bedeutet, dass die erste Station bei 5 mit einer Breite 5 ist, und die zweite ist in 8 mit einer Breite von 3 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top