2 Bedingungen einer while-Schleife. Eine ist c!='\n'.
-
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...