K&R Buch - Ich verstehe die Aufgabenstellung nicht
-
Auf Seite 34 steht:
Exercise 1-20. Write a program detab that replaces tabs in the input with the proper number of blanks to space to the next tab stop. Assume a fixed set of tab stops, say every columns. Should n be a variable or a symbolic parameter?
Heißt daß, das ich ein Programm schreiben soll, daß Tabs welche z.b. max. 8 Zeichen breit sind durch <=8 Leerzeichen ersetzen soll?
Und falls vor dem Tab noch ein Text steht, die Anzahl der Leerzeichen entsprechend gekürzt werden müssen um die entsprechende Position des nächsten Tabs zu erreichen?Also so:
Intern: Hau\tdrauf Tab Positionen: | | | | Eingabe: Hau drauf Ausgabe: // Hier sind zur Veranschaulichun die Leerzeichen zur bessern Sichtbarkeit durch Unterstriche ersetzt. Das Prog gibt natürlich Leerzeichen aus Hau_____drauf Und wenn ich nen String mit 2 tabs hintereinander habe: Hau\t\tdrauf Dann soll das rauskommen Hau drauf | | | | // < zum Vergleichen
Habe ich das so richtig verstanden?
-
Ich interpretiere die Aufgabenstellung anders: Schreiben sie ein Programm, dass die Tabs mit einer festen Anzahl an Leerzeichen ersetzt. Nehmen sie dann eine feste Anzahl von Tabstops an, sagen wir jede Spalte. Sollte n eine Variable oder ein symbolischer Parameter sein?
-
Ich hätte es so verstanden wie im Ursprungsposting. Halt genauso wie man es erwarten würde, wenn man ein Tool benutzt, das Tabs in Spaces umwandelt
-
So, das ist jetzt mein Programm.
#include <stdio.h> #define TABSIZE 8 /* K&R exercise 1-20 Programm ersetzt Tabs durch Leerzeichen und hält dabei die Tabbreite ein. */ int main() { char c; int counter = 0; printf("Programmende mit STRG+C bzw. STRG+D\n"); do { c = getchar(); if(c == '\t') { counter = TABSIZE - counter; do { putchar(' '); // Zum Überprüfen auf Korrektheit Leerzeichen durch ein * ersetzen. counter--; } while (counter != 0); } else { counter++; if ((counter == TABSIZE) || (c == '\n')) { counter = 0; } putchar(c); } } while (c != EOF); return 0; }
Das sollte jetzt eigentlich funktionieren, Fehler habe ich jedenfalls keine gefunden.
-
Du solltest c vom Typ int, nicht char, deklarieren, da getchar() ein int ergibt. Hauptsächlich weil EOF außerhalb des char-Wertebereichs liegt.
-
Das zweite auf dieser Seite gefällt mir auch ganz gut:
Ich finde es sogar etwas eleganter als meines, es ist nämlich, wenn man meines auf das wesentliche kürzt (ich bin etwas großzügig beim Platzverbrauch), um ca. 2 Zeilen kürzer als meines.
Von der Geschwindigkeit her dürften sich beide nicht viel nehmen.Seine erste if Abfrage mit der Prüfung auf das Zeilenende wird IMO etwas oft durchlaufen, aber dadurch spart er es im Else Zweig wieder ein, denn ich prüfe hier bei einem If auf Zwei Werte. \n und Tabsize.
Ansonsten ist es insofern anders, daß dieses Programm beim Counter nicht bis zum nächsten Tab hochzählt, wie bei meinem, sondern solange, solange bis das Newline Zeichen kommt.
Ob sein Modulo Operator sparsamer ist, als meine öfteren counter = 0 Sprünge weiß ich nicht.
Ansonsten ist es aber eh egal, da der Benutzer wohl die entscheidende Bremse sein dürfte.
Zumindest gilt das solange, solnage man die Eingabe nicht von einer Datei einliest.
-
Bashar schrieb:
Du solltest c vom Typ int, nicht char, deklarieren, da getchar() ein int ergibt. Hauptsächlich weil EOF außerhalb des char-Wertebereichs liegt.
Oh ja, mein Fehler. Da hast du Recht. Danke für den Hinweis.