Fehler
-
#include <stdio.h> #define TABINC 8 /* Tabulator-Abstand */ /* Tabulatorzeichen durch entsprechende Anzahl Leerzeichen ersetzen */ void main() { int c, nb, pos; pos = 1; /* Position des Zeichnes in Zeile */ while ((c = getchar()) != EOF) { if (c == '\t') { nb = 0; /* nötige Anzahl Leerzeichen */ nb = TABINC - (pos - 1) % TABINC; /* Die Anzahl der Tabulatorzeichen wird hier ermittelt */ while (nb > 0) { putchar(' '); ++pos; --nb; } } else if (c == '\n') /* Zeilentrenner */ { putchar(c); pos = 1; } else /* alle anderen Zeichen*/ { putchar(c); ++pos; } } }
Ich sollte normalerweise damit die Anzahl der Tabulatorzeichen durch Leerzeichen damit ersetzen können, aber er spuckt bei der Ausgabe immer den gleichen String aus, wie er in der Eingabe schon vorhanden ist.
-
Ich würde dir empfehlen dich mal mit switch() vertraut zu machen. if() else if()... wird auf die Dauer sehr unübersichtlich.
-
Bei dieser Übung dürfen wir kein switch() verwenden. Daher hab ich es probiert mit if-then-else zu lösen.
Wie würde denn die Lösung mit switch() aussehen ?
-
cHillb3rT schrieb:
Ich sollte normalerweise damit die Anzahl der Tabulatorzeichen durch Leerzeichen damit ersetzen können, aber er spuckt bei der Ausgabe immer den gleichen String aus, wie er in der Eingabe schon vorhanden ist.
Ist das nicht das, was du wolltest? Wie willst du denn in der Ausgabe Tabulatoren und ersetzte Leerzeichen unterscheiden?
-
Man geht ja den String entlang und schreibt mit nb die Anzahl der Tabulatoren auf.
Eine genau Erklärung liefere ich dir heute Abend, wenn ich Zeit hab, weil jetzt muss ich hier was weitermachen
-
cHillb3rT schrieb:
Bei dieser Übung dürfen wir kein switch() verwenden. Daher hab ich es probiert mit if-then-else zu lösen.
Wie würde denn die Lösung mit switch() aussehen ?
Warum sollte man da kein switch() verwenden dürfen?? Will man euch absichtlich quälen?
Wie das aussieht? Ganz einfach:
switch(c) { case '\t': ... break; case '\n': ... break; default: ... break; }
-
Warum sollte man da kein switch() verwenden dürfen?? Will man euch absichtlich quälen?
Wie das aussieht? Ganz einfach:
Sie wollen uns quälen ganz genau
K+R Ansi C ist auch an manchen Punkten sehr krass muss ich sagen, dass Buch hätte man auch einfacher machen können.Ich hab hier noch ein ähnliches Programm gemacht !:
#include <stdio.h> #define TABINC 8 /* Symbolische Konstante */ void main() { int c, nb, nt, pos; /* Integer-Typen */ nb = 0; /* Anzahl der Leerzeichen */ nt = 0; /* Anzahl der Tabulatorzeichen */ for (pos = 1; (c = getchar()) != EOF; ++pos) /* Position 1 wird als Wortanfang bzw Zeichenkettenanfang festgelegt. "c" wird bearbeitet, wenn es ungleich dem Zeichenkettenende ist. Danach wird die Position inkrementiert. */ if (c == ' ') /* Wenn c gleich leerer Stelle ist, nicht gleich Leerzeichen */ { if (pos % TABINC != 0) /* */ ++nb; /* Zu der Anzahl der Leerzeichen wird eins hinzugefügt */ else { nb = 0; /* Erneute Initialisierung von nb */ ++nt; /* Inkrementierung von "nt" */ } } else { /* */ for ( ; nt > 0; --nt) /* Keine Initialisierung von nt, aber dennoch gibt es eine Reinitialisierung von "nt" durch Dekrementierung */ putchar('\t'); /* Ausgabe des Tabulatozeichens */ if (c == '\t') /* Wenn c = einem Tabulatorzeichen ist, dann wird nb auf 0 gesetzt */ nb = 0; /* Hier wird nb auf 0 gesetzt */ else for ( ; nb > 0; --nb) /* nb ist größer als 0 wird leeres Zeichen ausgegeben und nb dekrementiert */ putchar(' '); /* Ausgabe eines leeren Zeichend */ putchar(c); /* Ausgabe von "c" */ if (c == '\n') /* Wenn "c" gleich dem Zeilentrenner ist dann wird Position auf 0 gesetzt */ pos = 0; /* Position wird auf 0 gesetzt */ else if (c == '\t') /* und falls c gleich dem Tabulatorzeichen ist, dann wird folgendes gemacht */ pos = pos + (TABINC - (pos - 1) % TABINC) - 1; /* Position ergibt sich aus der jetzigen Position + dem gezählten Tabulatorzeichen - der jetzigen Position-1... */ } }
-
Ich hab mal wieder ein neues Problem....
Eigentlich ist dieser Quellcode, den ich jetzt gleich posten werde richtig, aber trotzdem gibt es einen Fehler beim Compilieren:
// Das Programm soll alle Kommentare aus C-Programmen löschen. Dabei ist zu beachten, dass Zeichenketten in Doppelanführungszeichen und Zeichenkonstanten in einfachen Anführungszeichen korrekt behandelt werden müssen // #include <stdio.h> void rcomment(int c); void in_comment(void); void echo_quote(int c); /* alle Kommentare aus korrektem C-Programm entfernen */ main() { int c; while ((c = getchar()) != EOF) rcomment(c); return 0; } /* rcomment: Jedes Zeichen lesen, Kommentare entfernen */ void rcomment(int c) { int d; if (c == '/') if ((d = getchar()) == '*') in_comment(); else if (d == '/') { putchar(c); rcomment(d); } else { putchar(c); putchar(d); } if (c == '/' || c == '"') echo_quote(c); else putchar(c); } /* incomment: in gültigem Kommentar */ void in_comment(void) { int c, d; c = getchar(); d = getchar(); while (c != '*' || d != '/') { c = d; d = getchar(); } } /* echo_quote: ' oder " Folge ausgeben */ void echo_quote(int c) { int d; putchar(c); { while((d == getchar())!= c) putchar(d); if(d == '\') putchar(getchar()); } putchar(d); }
-
Anmerkungen zu deinen Code:
1. Benutze int main(), einfach main() ist nicht richtig.
2. Lerne deinen Code einzurücken, das wird nicht nur uns helfen, sondern dir Hilfe von uns zu bekommen, denn keiner mag Spaghetti sehen. Und wenn der Code eingerückt ist, ist er lesbar und man kann die Sachen schneller sehen.
3. Mach die Kommentare nicht so lang bzw. nicht alles in der selben Zeile. Dsfür gibt es/* das ist ein sehr laaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanges Kommentar, dass man in mehrern Zeilen lesen kann, somit hat man am Board keine lange große Scrollbalken */
-
// Jedes Zeichen aus s1 entfernen, das in der Zeichenkette s2 vorkommt // #include <stdio.h> void squeeze(char s1[], char s2[], int c); int main() { char Eingabe; // Eingabe wird als "char" definiert // Eingabe = getchar(); // Damit wird der Wert, den man eingibt eingelesen // squeeze; // Initialisierung der Umkehrungsfunktion // printf("%d %s\n", squeeze, squeeze); } void squeeze(char s1[], char s2[], int c) { int i, j, k; // Variablen mit Integertypen // for (i = k = 0; s1[i] != '\0'; i++) { for (j = 0; s2[i] != '\0' && s2[i] != s1[i]; j++) ; if(s2[i] == '\0') s1[k++] = s1[i]; } s1[k] = '\0'; }
Eine andere Sache ist noch diese. Was muss ich definieren, damit ich die Zeichenkette ausgeben kann.