ein paar fragen zu einem kleinen C-programm...

wurzelsepp

Ensign
Dabei seit
Jan. 2005
Beiträge
217
um auch mal "richtig" zu programmieren, hab ich jetzt mal angefangen - mit der hilfe eines buches - ein bisschen C auszuprobieren. zu dem folgenden "programm" (naja, also sagen wir progrämmchen, hehe) hätt ich allerdings noch zwei fragen:
Code:
#include <stdio.h>

int main(void)
{
	int in;

	while(in != EOF)
	{
	    in = getchar();
	    putchar(in);
	}
	
	return 0;
}
1.) zwar ist mir klar, dass das einlesen erst aufhört, wenn EOF erreicht ist (so wollt ichs ja haben :)) - aber warum is es eigentlich möglich, dass ich beliebig viele zeichen eingeben kann, dann enter drücke und genau diese zeichen wieder rauskommen?! nach meinem verständnis müsste es so sein, dass nur ein buchstabe wieder rauskommt - schließlich hab ich ja nur eine int-variable deklariert... liegt das an dem ein- und ausgabestrom? also wird sozusagen buchstabe für buchstabe in den ausgabestrom geschrieben (so müsste es ja sein, weil ich ja nur einen buchstaben einlese, bevor ich ihn mit putchar wieder ausgebe), der ausgabestrom aber auf einmal ausgegeben wird?

2.) warum kann ich mit dem programm so oft ich will eine eingabe machen, enter drücken, die ausgabe lesen und wieder eingabe machen, enter drücken, die ausgabe lesen etc... ?! die while-schleife müsste doch eigentlich nur dafür da sein, dass sie solange einliest, bis ein EOF kommt. aber wenn ich enter drücke, dann hab ich doch mein EOF und ergo müsste die schleife auch terminieren, oder?

wär cool, wenn mir das jemand erklären könnte :)
in dem buch hab ich leider nichts dazu gefunden - dem autor schien das ganz klar zu sein. mir aber leider nicht...
 

Arnd

Lieutenant
Dabei seit
Jan. 2005
Beiträge
926
Hallo wurzelsepp,

folgender Code verhält sich etwas nachvollziehbarer:

Code:
#include <conio.h>

#define ESCAPE 27

int main(void)
{
	int in = 0;

	while(in != ESCAPE) // until ESC pressed
	{
	    in = _getch();
	    _putch(in);
	}
	
	return 0;
}
Das sich getchar() so "seltsam" verhält wird wohl an der Pufferung von stdin und stdout liegen. Ausserdem wirst Du auch Probleme haben über die Tastatur ein EOF einzugeben. Von daher ist obige Routine wohl sinnvoller um die Kontrolle über jedes Zeichen und die Console zu haben.

MfG

Arnd
 
Zuletzt bearbeitet:

wurzelsepp

Ensign
Ersteller dieses Themas
Dabei seit
Jan. 2005
Beiträge
217
danke Arnd..!

ich hab das ganze jetz mal umgeschrieben - und so funktionierts auch :)
problem war genau das EOF. ich dachte, das könnte ich mit der enter-taste erwirken, was aber nicht der fall ist.

so funktionierts:
Code:
int main(void)
{
	char in;
	char vergleich = '\n';

	while(in != vergleich)
	{
		in = getchar();
	    putchar(in);
	}
	return 0;
}
danke nochmal!
 

7H3 N4C3R

Lt. Commander
Dabei seit
Feb. 2002
Beiträge
1.816
@wurzelsepp:

Da hat sich noch ein kleiner Fehler eingeschlichen. Beim ersten Vergleich ist in uninitialisiert. D.h. wenn du den Wert von in nicht setzt, steht etwas zufälliges dadrin. Das könnte auch zufällig dann \n sein, auch wenn das eher unwahrscheinlich ist.

Der Vergleich auf EOF ist übrigens auch nicht verkehrt gewesen. :) Und zwar liegt das daran, dass sie Eingabe ja nicht unbedingt die Tastatur sein muss, sondern auch eine Datei sein kann. Und die ist irgendwann zuende und dann wäre dein jetziges Programm in einer Endlosschleife.

Code:
int main(void)
{
	int in = 0; /* muss int sein, weil EOF nicht in char gespeichert werden kann - aus diesem Grund liefert getchar auch int zurück */
	char vergleich = '\n';

	while(in != vergleich)
	{
		in = getchar();
		if( in == EOF) {
			break;
		}
		putchar(in);
	}
	return 0;
}
 
Zuletzt bearbeitet:

wurzelsepp

Ensign
Ersteller dieses Themas
Dabei seit
Jan. 2005
Beiträge
217
tatsächlich!

danke 7H3 N4C3R!

das hatte ich vollkommen übersehen, dass ich die variable in gar nicht initialisiert hatte! zwar liefs auch so - es is eben sehr unwahrscheinlich - aber als wirklich korrekt konnte man das eigentlich nicht durchgehen lassen... ;)
 
Top