PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C Funktion gets


peecee
2003-03-20, 20:15:04
Hallo

Ich spiele gerad mit C rum und hab ein kleines Programm geschrieben.

Nun zu meinem Problem beim ersten Durchlauf arbeitet es korrekt.
Wenn man an dieser Stelle des codes angelangt ist und j eingibt.
printf("Willst du eine andere Datei oeffnen ? [j/n]: ");
dadurch wird die grosse while Schleife noch einmal ausgeführt.
dann wartet das Programm nicht auf eine Eingabe bei dem aufruf von "gets".
Warum wartet das prog nicht wie beim ersten Durchlauf auf ein Eingabe.

Ich hab auch schon versucht mit fflush den Tastaturbuffer zu leeren weil ich dachte vielleicht liegts daran.
hier der Code
#include <stdio.h>

#define DEBUG

int main()
{
int exit = 0;
char otherfile;
char fpath[150];
FILE *rfile;
while(exit == 0)
{
fflush;
printf("Gib den absoluten Pfad zu der Quellcode Datei an: ");
gets(fpath);
#ifdef DEBUG
puts(fpath);
#endif


if ((rfile = fopen(fpath, "rt")) == NULL)
{
printf("%s kann nicht geoeffnet werden !!\n",fpath);
printf("Willst du eine andere Datei oeffnen ? [j/n]: ");
scanf("%c", &otherfile);
if(otherfile == 'j' || 'n')
{
if(otherfile == 'n')
{
exit = 1;
}
}

}
else
{
printf("%s ist zum lesen geöffnet.",fpath);
}
}

return 0;
}

mfg peecee

stabilo_boss13
2003-03-20, 20:50:32
Hi,
man kann es schlecht lesen. Du solltest das code-Tag benutzen.

Nun zu deinem Problem.
Gets liest aus dem Standardstream einen String. Beim zweiten Durchlauf löscht du zwar mit fflush (muss das da nicht fflush(); heissen?) den Tastaturpuffer, aber nicht fpath. So enthält fpath beim zweiten Aufruf bereits einen Wert. Gets liest den nun wieder ein und meint, es sei schon fertig.
Lösche also nach fflush einfach den Inhalt von fpath und es sollte funktionieren.

fflush();
fpath=0x00;

zeckensack
2003-03-20, 21:03:24
Originally posted by peecee
fflush;
Böse Falle! Diese Zeile macht nichts. Genauso wiewhile (sascha_is_a_satanist)
{
93;
}

Du mußt für einen Funktionsaufruf Klammern setzen, ansonsten wertet der Compiler den Ausdruck als Zahl aus (=> die Addresse der Funktion). Wird diese nicht zugewiesen, wird sie einfach wieder verworfen.

stabilo hat's ja schon korrigiert, wollte nur nochmal darauf hinweisen ;)
*postingschind*

peecee
2003-03-20, 21:07:55
habs hinbekommen.
der fflush aufruf muss so lauten.
fflush(stdin);
die Zuweisung fpath=0x00 hab ich weggelassen mein compiler versteht das auch nicht.

mit freundlichen Dank
peecee

peecee
2003-03-20, 22:08:22
tja Ich hab noch mehr Bugs in dem kleinen Programm gefunden.
kann mir vieleicht jemand erklären warum
das
otherfile = 'g';
if(otherfile == 'j' || 'n')
{
printf("Warum wird dieser String angezeigt");
}
else
{
printf("Warum wird nicht dieser String angezeigt");
}
nicht funktioniert.
edit: was bedeutet eigenlich die Zuweisung fpath=0x00 was ist 0x00

mfg

Abe Ghiran
2003-03-21, 02:34:30
Hi!

Das Problem liegt hier:

if(otherfile == 'j' || 'n')

'n' ist ein char und damit nur eine Zahl und diese ist ungleich 0. Da in c alles ungleich 0 als wahr gewertet wird, ist auch dieser Ausdruck immer wahr.
Richtig ist:

if(otherfile == 'j' || otherfile == 'n')



fpath=0x00

0x00 ist eine 0 als hexadezimale Zahl (Zahlensystem zur Basis 16). Bei der Zuweisung hat sich stabilo_boss meiner Meinung nach vertan (er wurschtelt da an der Addresse deines arrays rum :)), richtig wäre folgendes:

fpath[0] = 0x00

Damit wird dem ersten Platz in deinem char array eine 0 zugewiesen, was in c ja heißt, das dieser String leer ist - Strings werden ja immer mit einer 0 beendet und wenn gleich das erste Zeichen eine 0 ist, ist der String leer.

Hmmm, auch schon wieder spät am Tag...gute Nacht :zzz:

Jan

peecee
2003-03-21, 16:13:20
danke für die Erklärung
"if(otherfile == 'j' || otherfile == 'n')"
auf das hätt ich selber auch kommen können.:(

mfg

stabilo_boss13
2003-03-21, 21:21:59
Originally posted by Abe Ghiran Bei der Zuweisung hat sich stabilo_boss meiner Meinung nach vertan (er wurschtelt da an der Addresse deines arrays rum :)), richtig wäre folgendes:

fpath[0] = 0x00
Eine fehlende Klammer gefunden, die andere wegoptimiert. Naja, muss z.Zt. den ganzen Tag mit C# arbeiten. Man sehe es mir nach. :D