Problem mit gets
-
Ich habe ein Programm mit String.Nun will dieses Programm nicht das man etwas eingibt.
Aber eigentlich sollte es.Hier der code:
DLLIMPORT void DllGame() { int a, b=0, c=1, d=0; char string[100]; FILE*datei; datei=fopen("Higscore.txt","a"); printf ("\nBitte Namen eingeben:"); gets (string); <hier liegt das problem. system("PAUSE");
Wäre für hilfe dankbar.
mfg.
Stefan
-
Was genau ist denn das Problem? Ein bisschen mehr Info wäre schon nicht schlecht.
-
Ein Problem ist, dass er einen Buffer-Overflow hat.
-
Dann sollte er sich halt fgets ansehen.
-
Also ich hab jetzt zwei Fragen
1. Was hat es mit diesem Buffer-Overflow aufsich?
2. Wie wende ich fgets an oder gibt es einen Link dazu?
Das Programm überspringt diesen Schritt einfach.
mfg.
Stefan
-
Ein Buffer-Overflow ist allgemein gehalten ähnlich wie ein selbst programmierter Virus des Programms. Dies tritt dann auf, wenn du ein Array überschreibst (meist geschieht das unabsichtlich). Steht nun in diesem Array ein Code kann es dazu kommen, dass das programm diesen Code unter Windows oder ähnlichem ausführt.
Ich hoff eich habe mich richtig ausgedrückt, schriftlich ist das weng schwierig
- Edit -
fgets(char Variable, int n, File *fz);
Du liest damit aus einer Datei einen ganzen Stream aus
-
hi Stefan311
das mit fgets geht folgendermaßen:
fgets(variablennameInDenDuDenEingegebenenWertSopeichernWills, anzahlDerMaximaleZeichenDieFgetsEinliest, stream);
also z.B:
char string[100]; fgets(string, 100, stdin);
natuerlich stdlio einbinden
-
mit fgets laesst sich ein puffer overflow leicht vermeiden
-
Eigentlich dachte ich nicht an Dateien einlesen.Der benutzer macht eine eingabe.Diese wird mit punkten in eine Datei geschrieben.Früher hats geklappt.Jetzt hab ich denn Code mit Dlls eingebaut.Und nun will es nicht.Es Zeigt es an macht aber sofort weiter im Programm.Man kann also nicht seinen namen eingeben.
-
Stefan311 schrieb:
Diese wird mit punkten in eine Datei geschrieben.Früher hats geklappt.
wie soll's auch in die datei kommen? da ist nirgends ein 'fwrite' o.ä. zu sehen.
-
das ist erst am ende.Weil die Punkte doch erst gezählt werden müssen.Alerdings mach ich das mit fprintf
printf("\nDas wars Fragen beendet."); getch(); printf("\nIhr name %s wird eingetragen\n", string); getch(); fprintf (datei, "Name: %s Punkte:%d\n", string, d); < Hier das schreiben in die Datei fclose(datei); }
fwrite kenne ich nicht und vor so ner woch hats auch geklappt.Jetzt hab ich es in eine Dll kepackt und prommt klappt es nicht mehr.Es stürzt ja auch nicht ab.Es zeigtan und macht sofor weiter.
mfg.
Stefan
-
howdy!
mann fgets lest nicht von ner datei waenn du den stream stdin verwaendest!!!
-
@--linuxuser-- Dein Beitrag ist nicht besonders hilfreich.
Da er den Buffer auf 100 Zeichen gestzt hat, und ich nicht davon ausgehe das er mehr als 100 Zeichen eingibt bringt fgets nichts.
den gets ist im Endeffekt nichts anderes als ein fgets(stdin,....). Warum soll eine funktionierende Routine gegen eine andere austauschen.
Seine Aussage ist ja auch als er es nicht in eine dll gepackt hatte, funktionierte es, erst als er es in eine dll pckt funktionierts nicht mehr.
Dieses Problem hat wahrscheinlich etwas mit der Code-Generierung bei DLL`s zu tun.
Ich weis an der Stelle auch nicht weiter. Das es etwas mit OS-zu tun hat, vielleicht besser ins Winapi Forum verschieben
-
PAD schrieb:
Da er den Buffer auf 100 Zeichen gestzt hat, und ich nicht davon ausgehe das er mehr als 100 Zeichen eingibt bringt fgets nichts.
Und wenn doch jemand mehr als 99 Zeichen eingibt? Dann crasht evtl. das Programm. Toll. Naja, wenigstens hat man beim Programmieren 11 Zeichen weniger tippen müssen
-
Grundsatzdiskussionen machen Spaß, helfen aber nciht weiter. Anstelle einem Anfänger Antworten zu geben die nicht zum Problem passen und verwirren wäre echte Hilfe gut.
Leider muß ich bei dem Problem im Moment auch passen.
Ich habe einen ähnlichen Fall:
Ich habe eine Funktion der ich einen korrekten Filepointer (File fp) eines
existierenden und im Programm geöffneten Files übergebe. Befindet sich diese Funktion
- in einem obj-File und wird mitgelinkt oder
- als Source im Projekt und wird mitkompiliert oder
- in einer statischen Bibliothek (.liB)
funktioniert es einwandfrei.Lagere ich exact diese Funktion in eine DLL aus so bekommen ich ein Fehler 5
access violation.
Lagere ich das öffnen des Files ebenfalls in eine Funktion in der dll aus
funktionierts.Bisher konnte mir noch niemand helfen. Ich muß diese Toolfunktion in einer
statischen library zu den Projekten binden
-
Also ist das ein "allgemeiner" Fehler?Dann liegt es an was anderem?Dan bin ich wenigsten froh das es ausnamstweise nicht an mir lag.
Ich werde es jetzt fgets einbauen.
mfg.
Stefan
-
Ich glaube nicht, das es mit fgets besser wird, aber viel Glück
-
PAD schrieb:
Ich habe einen ähnlichen Fall:
Ich habe eine Funktion der ich einen korrekten Filepointer (File fp) eines
existierenden und im Programm geöffneten Files übergebe. Befindet sich diese Funktion
- in einem obj-File und wird mitgelinkt oder
- als Source im Projekt und wird mitkompiliert oder
- in einer statischen Bibliothek (.liB)
funktioniert es einwandfrei.Lagere ich exact diese Funktion in eine DLL aus so bekommen ich ein Fehler 5
access violation.
Lagere ich das öffnen des Files ebenfalls in eine Funktion in der dll aus
funktionierts.das liegt daran, dass die dll eine eigene kopie der runtime-lib verwendet (msvcrtXXX.lib oder wie die heisst). mit einem 'FILE *x = fopen(...' in dem programm kann die dll nix anfangen weil ihre rtl das file nicht geöffnet hat. abhilfe: dynamische (dll-version) der rtl in beiden modulen verwenden, dann gibbets die nur einmal und alle sind zufrieden.
PAD schrieb:
Bisher konnte mir noch niemand helfen.
dann frag das nächste mal hier im board. wie heisst doch das motto? 'irgendwer weiss immer eine antwort'
-
@net Guter Witz
Schau mal hier, das war der zweite Versuch06 Apr 2005 21:17 Titel: Probleme mit pointer und Datenübergabe an dll´s
http://www.c-plusplus.net/forum/viewtopic-var-p-is-761441-and-highlight-is-.html#761441Der erste mit exact dem selben Ergebnis war ungefähr 3 Monate vorher,
dank der derzeitigen schlechten Suche im Board, er kann "WriteFileHeader" im Board "MFC (Visual C++)" nicht finden, bleibe ich die zweite Quellenangabe schuldig
Das zum "Frag das nächste mal hier"
Aber sowas kann immer passieren, auch in einem so guten Forum wie hier
,
um so mehr freut es mich, das eine Randerwähnung des Themas neu Ideen bringtIch arbeite mit MS VC 6.0 Service Pack 4 unter Windows 2000 / NT / XP und compiliere auch C Code mit der Einstellung C++ (Er bringt dann mehr Fehlermeldungen, Ja ich bin ein Masochist)?
das liegt daran, dass die dll eine eigene kopie der runtime-lib verwendet (msvcrtXXX.lib oder wie die heisst). mit einem 'FILE *x = fopen(...' in dem programm kann die dll nix anfangen weil ihre rtl das file nicht geöffnet hat. abhilfe: dynamische (dll-version) der rtl in beiden modulen verwenden, dann gibbets die nur einmal und alle sind zufrieden.
Hast du eine Ahnung auf welche Weise ich den Compiler überreden kann auf die dynamische Bindung umzustellen?
Schon mal Danke
-
weiss ich jetzt auch nicht, aber vielleicht könnte das gehen:
// funktion in dll
void use_external_filepointer (FILE p)
{
#ifdef WIN32
// mach einen neuen FILE vom file handle in *p
p = _dup(_fileno(p));
#endif
// hier normale ansi-c fileoperationen
// ...
}ich denke mal ein fclose() entweder in der dll oder der exe sollte das file schliessen. trotzdem brauchste wohl in beiden ein fclose, um beide FILE* zu freen. einfach mal rumprobieren.
guckst du auch: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_crt__dup.2c_._dup2.asp