Wieso geht dieser einfache Quellcode nicht? geschlossen 

  • Ersteller Ersteller made07
  • Erstellt am Erstellt am
Status
Für weitere Antworten geschlossen.
M

made07

Dieser Quellcode soll in kompilierter Form die Eingabezeichen, die man in der Konsole eingibt, zählen und, sobald Enter gedrückt wird, die Anzahl der eingegebenen Zeichen ausgeben.
Leider funktioniert er nicht. Ich benutze gcc 3.3.5 zum Kompilieren. Doch nach dem Aufruf tut sich nichts, d.h. das Programm beendet sich nicht einmal. Der einzige Weg, rauszukommen, ist Strg-C zu drücken... und dabei sollte es doch nach Druck der Eingabetaste die Anzahl eingegebener Zeichen anzeigen und dann sich beenden. Doch nichts funktioniert.

Hier der Code:
Code:
#include 

main()
{
long zeichen;
zeichen = 0;
while(getchar() != EOF)
++zeichen;
printf("%ld\n", zeichen);
}

Woran könnte es liegen?
Vielen Dank im Voraus für Tipps und Hilfe,
made07
 
Hi ,

Also ich glaube du hast wohl beim lernen nicht richtig gelesen also erstma was falsch ist

1.
PHP:
main()
?? Ich glaube das soll
PHP:
int main()
heißen .

2.
PHP:
while(getchar() != EOF)
?? Eine While Schleife mit einer Bedingung aber ohne Befehle .

3. Am Ende muss ein Wert zurückgeliefert werden da wie bei dir das Programm sich einfach aufhängen würde .

SRY nen richtigen Code kann ich dir jetzt net liefern bin zu müde , aber müsstest du auch selber hinbekommen .

MfG Fr@ger132
 
Tja, das Problem ist immer noch da, aber ich habe jetzt durch eine viertel Stunde googlen was wichtiges gefunden:
Das EOF wird nicht durch die Eingabetaste generiert, sondern durch eine Tastenkombination, unter Windows Strg-Z und unter Linux Strg-D (aber erst einmal Eingabe drücken vorher!) Die Eingabetaste wird zwar dann als Zeichen mitgezählt, aber es funktioniert!!

Danke für die Tipps, übrigens ist der Befehl von der while-Schleife das ++zeichen, ich werde in Zukunft Klammern darum machen, obwohl es so auch zu funktionieren scheint.

Vielen Dank,
made07
 
Frager132 schrieb:
Hi ,

Also ich glaube du hast wohl beim lernen nicht richtig gelesen also erstma was falsch ist

1.
PHP:
main()
?? Ich glaube das soll
PHP:
int main()
heißen .

2.
PHP:
while(getchar() != EOF)
?? Eine While Schleife mit einer Bedingung aber ohne Befehle .

3. Am Ende muss ein Wert zurückgeliefert werden da wie bei dir das Programm sich einfach aufhängen würde .

SRY nen richtigen Code kann ich dir jetzt net liefern bin zu müde , aber müsstest du auch selber hinbekommen .

MfG Fr@ger132
Es wird durchaus von vielen compilern auch eine "typfreie" main-funktion unterstüzt, diese liefert dann einfach "void" zurrück (ich glaube dies ist sogar ANSI konform).
Und die while-Schleife führt die inkrementierung der Variable Zeichen durch, auch dies ist gängige, ANSI konforme, Syntax.
Syntaktisch ist also alles korrekt, ich würde in der entsprechenden Doku mal nachlesen was genau getchar für einen Rückgabewert hat (bzw. ob überhaupt irgendwann einmal ein EOF zu erwarten ist).
 
Also, von der Syntax her ist alles ok.
Wenn nur eine Anweisung im Anweisungsblock erfolgt, kann man die Klammern weglassen.
getchar() liefert einen Integerwert zurueck.
EOF steht fuer End of File - etwas fraglich in diesem Zusammenhang!
du willst die Enter-Taste abfragen - nun, leider liefern Sondertasten (F1 bis F12, ENTF, ENDE, POS1 usw.) immer 2 Byte, wobei als erstes ASCII-0 geliefert wird.

Versuchs mal hiermit:

#include
#define ESC 27

int main()
{
long zeichen;
int x;
zeichen = 0;
while((x=getchar()) != ESC)
++zeichen;
printf("%ld\n", zeichen);
return 0;
}


Na ja, sauber ist das alles nicht, du kannst jetzt wahrscheinlich erst nach druecken der ESC-Taste und dann nach druecken der Entertaste dein Programm beenden.

Ich werde mir die Geschichte nochmals anschauen. ;)
 
oder so...

Code:
#include 
#include 

void main (void)
{
int x;
char test[100];
gets(test);
x=strlen(test);
printf("%i",x);
}

damit sind logischerweise "nur" 101 zeichen möglich, aber das solte ja reichen...
 
So ist es wohl etwas sauberer (wenn auch mit Typumwandlung) und funktioniert auch:

Code:
#include 

int main()
{
long zeichen=0;
unsigned char x;

while((x=getchar()) != 0xA)
++zeichen;
printf("%ld\n",zeichen); 
return 0;
}

Jetzt kann solange auf der Tastatur rumgehaemmert werden, bis ENTER gedrueckt wird.
 
Cool danke an euch alle für eure Bemühungen!!
Also liegt es sozusagen nur daran, dass durch die Enter-Taste kein EOF erzeugt wird...
Danke für eure vielen Beispiele!
Jetzt ist alles klar.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten