2 Bedingungen einer while-Schleife. Eine ist c!='\n'.
-
Hallo,
ich möchte zwei Abbruchbedingungen in einer Schleife verwenden. Diese verküpfe ich mit "&&". Eine Abbruchbedingung ist c != '\n'. Also eine neue Zeile.
#include <stdio.h> int main(int argc, char **argv) { int c , i = 0; while (c = getchar() != EOF && c != '\n') i++; printf ("%d Zeichen wurden eingelesen\n", i);; return 0; }
Leider funktioniert nur die EOF-Bedingung. STRG+Z bzw. STRG+D auf Unix.
Was mache ich falsch?
Gruß
Tim
-
Spontan würde ich sagen: setz mal ein paar Klammern, um klarzustellen, was wie zusammengehört und nicht auf die Auswertungsreihenfolge reinzufallen.
-
Hallo matze,
ich versuchs mal. Aber ich sags gleich: Ich bin neu :).
#include <stdio.h> int main(int argc, char **argv) { int c , i = 0; while (((c = getchar()) != EOF) && (c != '\n')) i++; printf ("%d Zeichen wurden eingelesen\n", i); return 0; }
Tim
-
Sieht doch gut aus. Läuft es jetzt auch?
-
Leider nicht.
-
Also bei mir klappt dein Code. Nach Eingabe von Enter kommt die printf-Ausgabe. Bei dir etwa nicht?
-
Nach der Eingabe von Enter gibt eine neue leere Zeile. Die While-Schleife wird nicht beendet. Die kompellierte Datei will hier keiner sehen, oder?
Ich habe auch die offizielle Lösung der Programmieraufgabe ausprobiert. Ebenfalls erfolglos. Liegt es am Compiler? GCC. Ich benutze MinGW mit CodeLite.
-
Eine andere IDE (Code:Blocks) macht keinen Ärger. Nun muss ich also erst ein mal eine vernünftige IDE finden. Danke für deine Hilfe, Matzte!
Ergänzung 1:
Aber auch Code:Blocks übersetzt mir#include <stdio.h> int main(int argc, char **argv) { int c , i = 0; while (c = getchar() != EOF && c != '\n') i++; printf ("%d Zeichen wurden eingelesen\n", i);; return 0; }
nicht wie ich es will. Auch hier werden Enter-Eingaben nicht interpretiert (bzw. nur um eine neue Zeile einzufügen).
-
Na ja, dazu kann ich wenig sagen, da ich nur das Visual Studio benutze. Damit würde der Code kein Problem sein. Das VS unterstützt aber leider nur den etwas älteren C89-Standard...
-
Die kostenlose Version (Visual C++ Express) habe ich installiert. Kann man damit C programmieren?
-
Katzenstreu schrieb:
Die kostenlose Version (Visual C++ Express) habe ich installiert. Kann man damit C programmieren?
Ja, kann man. Ich verdiene zum Teil meine Brötchen damit (mit der Professional-Version, ist für ANSI-C aber egal, da ist die EE genauso gut). Du musst halt nur damit leben, dass der Compiler nur C89 kann. Ich kann damit gut leben.
Um den Compiler dazu zu bewegen, musst du deine Dateien einfach mit der Endung .c versehen. Außerdem kann man das noch explizit in den Projekteinstellungen festlegen (ist aber normalerweise nicht nötig).
-
Was du wahrscheinlich machen willst, ist folgendes:
#include <stdio.h> int main(int argc, char **argv) { int c, i = 0; while ((c = getchar()) != EOF && c != '\n') i++; printf("%d Zeichen wurden eingelesen\n", i); return 0; }
Sonst steht in c nur true oder false von der Auswertung
getchar() != EOF
.
Zudem weiß ich nicht ob diese UND-Verknüpfung von links nach rechts ausgewertet wird. (Imo nicht vom Standard vorgeschrieben.)
Also besser in der Schleife einif (c == '\n') break;
einfügen.
-
lagalopex schrieb:
Was du wahrscheinlich machen willst, ist folgendes:
#include <stdio.h> int main(int argc, char **argv) { int c, i = 0; while ((c = getchar()) != EOF && c != '\n') i++; printf("%d Zeichen wurden eingelesen\n", i); return 0; }
Hm, das hatte er eigentlich schon mal richtig gepostet, nachdem ich empfohlen hatte, Klammern zu setzen. Der danach gepostete Code war dann wieder falsch...
-
Mit Visual komm ich überhaupt nicht klar. Also dachte ich mir: je weniger, desto einfacher. Unter Lunux den GCC (4.43) gestartet und meine Datei kompiliert. Genau das selbe. Enter wird ignoriert.
Nun habe ich den Code, nach lagalopex, überarbeitet.#include <stdio.h> int main(int argc, char **argv) { int c , i = 0; while (c = getchar() != EOF) if (c == '\n') break; i++; printf ("%d Zeichen wurden eingelesen\n", i); return 0; }
und die Datei twes.c wie folgt ausgeführt: gcc ./twes.c -ansi -Wall
Aber auch hier: beim Öffnen der Datei wird Enter immer noch ignoriert.
-
Du hattest es doch schon richtig! Argh!
Als ich sagte "setz mal ein paar Klammern", hast du doch eigentlich korrekten Code gepostet, wenn ich jetzt nix übersehe.
Ok, Erklärung:
Dieser Code hier
while (c = getchar() != EOF)
sorgt dafür, dass c das Ergebnis von "getchar() != EOF" zugewiesen wird. Es wird also ein Zeichen eingelesen und mit EOF (-1, glaube ich) verglichen. Das Resultat ist ein boolscher Wert (true oder false), und diesen weist du halt c zu. Da normalerweile getchar immer einen Wert > -1 liefert, ist der Ausdruck quasi immer true und c ist immer 1. Ergo: deine Schleife läuft weiter. Was du nun einfach machen musst, ist "c = getchar()" in Klammern zu setzen, damit dieser Teilausdruck vor dem Vergleich mit EOF ausgewertet wird.
-
COOL! Der Compiler ist doch "ein guter"!
#include <stdio.h> int main(int argc, char **argv) { int c , i = 0; while ((c = getchar()) != EOF) if (c == '\n') break; i++; printf ("%d Zeichen wurden eingelesen\n", i); return 0; }
Ich habe einfach nur logisch geklammert, wo man klammern könnte. Aber deine Erläuterung war mir nicht bewusst. Japp, EOF ist normalerweise -1.
Danke Matze!
-
Tja, auf die Auswertungsreihenfolge ist wohl jeder schon mal reingefallen.
Besser zuviele Klammern, als zu wenige...
-
Katzenstreu schrieb:
#include <stdio.h> int main(int argc, char **argv) { int c , i = 0; while ((c = getchar()) != EOF) if (c == '\n') break; i++; printf ("%d Zeichen wurden eingelesen\n", i); return 0; }
Wir sind nicht in python, also musst du die klammern für die while schleife schon selbst setzen...