programm beendet sich selber - hilfe



  • hi.

    also mein programm beendet sich nachdem ich im menü punkt 2. ausgewählt hab, dann sollte er (was er auch tut) in eine funktion spingen, dort werden dann einige sachen eingelesen, aber dazu kommt es nich, es beendet sich.
    hier der code:

    /*
    FIDB ist ein Filmarchiv.
    Man kann Filmnamen, Art, Codec usw. eintragen und dies dann auch
    abspeichern, ausdrucken oder auch in eine sql db eintragen lassen.
    */
    
    #include <stdlib.h>
    #include <stdio.h>
    
    int fidblesen(); /*die db lesen*/
    int fidbschr(); /*in die db schreiben*/
    int fidbaen(); /*db ändern*/
    
    int main()
    
    {
    	int menua;
    
    	printf("FIDB - v. 0.1 - by err0r\n");
    
    	printf("Bitte waehlen sie ein Menupunkt aus.\n");
    	/*das menü*/
    	printf("1. FIDB lesen\n");
    	printf("2. FIDB schreiben\n");
    	printf("3. FIDB aendern\n");
    	/*printf("4. FIDB beenden\n"); nur bei windows*/
    	printf("\n");
    	scanf("%d",&menua);
    
    	switch(menua)
    	{
    		case 1: fidblesen();
    		break;
    
    		case 2: fidbschr();
    		break;
    
    		case 3: fidbaen();
    		break;
    
    		/*case 4: exit(0);
    		break; nur bei windows*/
    	}
    
    /*getch 0; nur bei windows*/
    } 
    
    int fidblesen() /*die db lesen*/
    {
    }
    int fidbschr() /*in die db schreiben*/
    {
    #define MAX 101
    	int menuafidbschr;
    	int i;
    
    	char filmname[MAX];
    	int filmnr, filmcodec, filmart, filmsource, filmfsk, filmdatum;
    	/*hierzu, also zu dieser schleife kommt es überhaupt nicht :( aber wenn ich was vor die schleife pack dann gibt er es aus, aber die schleife wird net durchgezogen, woran kanns liegen?*/
    	for(i=0;i==1;i++)
    	{
    		printf("Film in die FIDB hinzufuegen.\n");
    		printf("\n");
    		printf("Eingabe:\n");
    		printf("Filmname:\n");
    		scanf("%s",&filmname[i]);
    	}
    }
    int fidbaen() /*db ändern*/
    {
    }
    

    thx



  • hi.

    also hab festgestellt das es an der schleife liegt. und es dann erneut probiert, nur da kommt immer: Segmentation fault (bei der ausgabe).
    so siehts aus:

    int fidbschr() /*in die db schreiben*/
    {
    #define MAX 101
    	int menuafidbschr;
    	int i;
    
    	char filmname[MAX];
    	int filmnr, filmcodec, filmart, filmsource, filmfsk, filmdatum;
    
    	for(i=0; i<1; i++)
    		{
    		printf("Film in die FIDB hinzufuegen.\n");
    		printf("\n");
    		printf("Eingabe:\n");
    		printf("Filmname:\n");
    		scanf("%s",&filmname[MAX]);
    		}
    
    	for(i=0; i<1; i++)
    		{
    		printf("eingegebener filmname: %s",filmname[MAX]);
    


  • Zu deiner 1. Schleife:

    for(i=0;i==1;i++)
    

    Is doch klar, dass die Schleife nie ausgeführt ist, weil gleich zu Beginn die Bedingung falsch ist. 1 ist nunmal != 0

    Zur neuen Schleife: Bei der momentanen Bedingung (i<1) kannst du dir gleich die Schleife sparen, da sie ja eh nur einmal durchlaufen wird.
    Zu dem segfault:
    Probier mal statt scanf("%s",&filmname[i]); das:
    scanf("%s", filmname); // Da Leerzeichen in Filmtiteln vorkommen können besser gets()



  • interpreter schrieb:

    Zu deiner 1. Schleife:
    Probier mal statt scanf("%s",&filmname[i]); das:
    scanf("%s", filmname); // Da Leerzeichen in Filmtiteln vorkommen können besser gets()

    Laßt bloß die Finger von scanf und gets(). Diese Funktionen wissen nicht, wie groß der Buffer ist, in den sie schreiben. D.h., wenn der Benutzer einen Film-Namen eingibt, der länger ist als der Buffer, dann schreiben diese Funktionen über die Buffer-Grenze hinaus.
    (Ihr wisst schon, daß es solche Fehler sind, die immer wieder zu Sicherheitslücken führen? Man denke nur an die ganzen DCOM- und IE-Bugs).

    Alternativen:
    - snscanf (bzw. _snscanf bei Microsoft)
    - fgets

    Auf jeden Fall *ganz genau* in der Doku nachlesen was passiert, wenn der Input länger als der Buffer war.
    Manche Funktionen stellen auch dann sicher, daß der Buffer mit einem 0-Byte terminiert ist, andere tun das nicht.

    Ich will hier wirklich nicht einen auf Oberlehrer machen, aber man sollte sich angewöhnen, immer auf Buffer-Overflows zu achten. Oder wollt ihr für die nächste große Sicherheitslücke verantwortlich sein?



  • okay. dankeschön. und wie funktioniert das genau mit dem gets?
    gets(filmname[i]); oder wie?

    thx



  • [quote="Raving Tux"]

    interpreter schrieb:

    Ich will hier wirklich nicht einen auf Oberlehrer machen, aber man sollte sich angewöhnen, immer auf Buffer-Overflows zu achten. Oder wollt ihr für die nächste große Sicherheitslücke verantwortlich sein?

    hi.

    dankeschön! ne, kein thema. und erklärst du mir auch wie das daimt geht? mit fgets?

    thx



  • Raving Tux schrieb:

    interpreter schrieb:

    Zu deiner 1. Schleife:
    Probier mal statt scanf("%s",&filmname[i]); das:
    scanf("%s", filmname); // Da Leerzeichen in Filmtiteln vorkommen können besser gets()

    Laßt bloß die Finger von scanf und gets(). Diese Funktionen wissen nicht, wie groß der Buffer ist, in den sie schreiben. D.h., wenn der Benutzer einen Film-Namen eingibt, der länger ist als der Buffer, dann schreiben diese Funktionen über die Buffer-Grenze hinaus.
    (Ihr wisst schon, daß es solche Fehler sind, die immer wieder zu Sicherheitslücken führen? Man denke nur an die ganzen DCOM- und IE-Bugs).

    Alternativen:
    - snscanf (bzw. _snscanf bei Microsoft)
    - fgets

    Auf jeden Fall *ganz genau* in der Doku nachlesen was passiert, wenn der Input länger als der Buffer war.
    Manche Funktionen stellen auch dann sicher, daß der Buffer mit einem 0-Byte terminiert ist, andere tun das nicht.

    Ich will hier wirklich nicht einen auf Oberlehrer machen, aber man sollte sich angewöhnen, immer auf Buffer-Overflows zu achten. Oder wollt ihr für die nächste große Sicherheitslücke verantwortlich sein?

    Und was hat das mit dem hier vorliegenden Problem zu tun? Richtig: Nichts.



  • [quote="reba"]

    Raving Tux schrieb:

    interpreter schrieb:

    Ich will hier wirklich nicht einen auf Oberlehrer machen, aber man sollte sich angewöhnen, immer auf Buffer-Overflows zu achten. Oder wollt ihr für die nächste große Sicherheitslücke verantwortlich sein?

    hi.

    dankeschön! ne, kein thema. und erklärst du mir auch wie das daimt geht? mit fgets?
    thx

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_fgets.2c_.fgetws.asp

    Für FILE* kannste stdin übergeben...



  • hm? msdn? ne nutz linux, daher auch standard C!
    was soll ich denn nu nehmen? fgets? oder was?
    so wie ich das versteh wird da ine datei geschrieben, aber das will ich doch gar net, nur EINLESEN (like scanf!!!) soll ich gets nehmen oder was jetzt?

    #include <stdio.h>
    
    int main( void )
    {
       FILE *stream;
       char line[100];
    
       if( (stream = fopen( "crt_fgets.txt", "r" )) != NULL )
       {
          if( fgets( line, 100, stream ) == NULL)
             printf( "fgets error\n" );
          else
             printf( "%s", line);
          fclose( stream );
       }
    }
    

    danke



  • Und was hat das mit dem hier vorliegenden Problem zu tun? Richtig: Nichts.

    Deshalb ist der Code trotzdem buggy. Und wenn ein Anfänger so einen Fehler in seinem Code hat, dann sollte man ihn doch darauf hinweisen, damit er es sich gleich angewöhnt, darauf zu achten.
    Und es ist ja nicht so, daß diese Art von Fehler keine Konsequenzen hätte.
    Stattdessen wurde ihm vorgeschlagen, gets() zu benutzen. Echt super 😞
    Das ist in etwas genauso toll, wie einen Blinden direkt auf eine stark befahrene Straße zu führen.



  • hi.

    okay dann erklär mir mal bitte wie ich das dann bei mir realisier? 😞
    versuch das grad schon, aber der code von der msdn sagt mir nur das etwas in ein file geschrieben wird, was ich ja net will. nur einlesen in das array.
    thx



  • ka schrieb:

    hm? msdn? ne nutz linux, daher auch standard C!
    was soll ich denn nu nehmen? fgets? oder was?
    so wie ich das versteh wird da ine datei geschrieben, aber das will ich doch gar net, nur EINLESEN (like scanf!!!) soll ich gets nehmen oder was jetzt?

    Und weil du Linux benutzt kannst du also nicht die msdn benutzen, soso...

    Wenn du mein Posting zuvor gelesen hättest, dann wüsstest du, dass wenn du für den Filepointer stdin übergibst du von der Std-Eingabe lesen kannst.



  • hi. also so:

    #include <stdio.h>
    
    int main( void )
    {
       FILE *stdin;
       char line[100];
    
          fgets( line, 100, stdin )
             printf( "%s", line);
    }
    

    so?



  • hm schrieb:

    hi.

    okay dann erklär mir mal bitte wie ich das dann bei mir realisier? 😞
    versuch das grad schon, aber der code von der msdn sagt mir nur das etwas in ein file geschrieben wird, was ich ja net will. nur einlesen in das array.
    thx

    char filmname[MAX]; 
    char* res = fgets(filmname, sizeof(filename), stdin);
    


  • hi.
    ne es geht so irgendwie auch nich, das kommt:
    *
    dean@gentoo diverses $ ./modbp
    FIDB - v. 0.1 - by err0r
    Bitte waehlen sie ein Menupunkt aus.
    1. FIDB lesen
    2. FIDB schreiben
    3. FIDB aendern

    2
    Film in die FIDB hinzufuegen.

    Eingabe:
    Filmname:
    Segmentation fault
    *

    und so sieht der code aus:

    int fidbschr() /*in die db schreiben*/
    {
    #define MAX 101
    int menuafidbschr;
    FILE *stdin;
    char filmname[MAX];
    int filmnr, filmcodec, filmart, filmsource, filmfsk, filmdatum;
    
    	printf("Film in die FIDB hinzufuegen.\n");
    	printf("\n");
    	printf("Eingabe:\n");
    	printf("Filmname:\n");
    	char* res = fgets(filmname, sizeof(filmname), stdin);
    
    }
    

    bye



  • ne schrieb:

    hi.
    [cpp]
    int fidbschr() /*in die db schreiben*/
    {
    #define MAX 101
    int menuafidbschr;
    *FILE stdin;
    [/cpp]

    Diese Zeile ist das problem.
    stdin ist eine globale Variable der C-Runtime. Durch deine eigene Deklaration 'überdeckst' du diese globale Variable, und wenn du später fgets aufrufst, übergibst du deine eigene 'stdin'-Variable statt der der C-Runtime.
    Einfach diese Zeile entfernen, und es sollte funktionieren.



  • ne schrieb:

    hi.
    ne es geht so irgendwie auch nich, das kommt:
    *
    dean@gentoo diverses $ ./modbp
    FIDB - v. 0.1 - by err0r
    Bitte waehlen sie ein Menupunkt aus.
    1. FIDB lesen
    2. FIDB schreiben
    3. FIDB aendern

    2
    Film in die FIDB hinzufuegen.

    Eingabe:
    Filmname:
    Segmentation fault
    *

    und so sieht der code aus:

    int fidbschr() /*in die db schreiben*/
    {
    #define MAX 101
    int menuafidbschr;
    FILE *stdin;
    char filmname[MAX];
    int filmnr, filmcodec, filmart, filmsource, filmfsk, filmdatum;
    	
    	printf("Film in die FIDB hinzufuegen.\n");
    	printf("\n");
    	printf("Eingabe:\n");
    	printf("Filmname:\n");
    	char* res = fgets(filmname, sizeof(filmname), stdin);
    
    }
    

    bye

    Kommentier das FILE* stdin aus, dann sollte es gehen. stdin is einfach ein #define, das du nicht anlegen musst.



  • hi.
    ne leider nich. dann kommt nur das:
    *
    dean@gentoo diverses $ ./modbp
    FIDB - v. 0.1 - by err0r
    Bitte waehlen sie ein Menupunkt aus.
    1. FIDB lesen
    2. FIDB schreiben
    3. FIDB aendern

    2
    Film in die FIDB hinzufuegen.

    Eingabe:
    Filmn
    dean@gentoo diverses $:
    *

    und der code is so(das FILE *stdin auskommentiert):

    int fidbschr() /*in die db schreiben*/
    {
    #define MAX 101
    int menuafidbschr;
    /*FILE *stdin;*/
    char filmname[MAX];
    int filmnr, filmcodec, filmart, filmsource, filmfsk, filmdatum;
    
    	printf("Film in die FIDB hinzufuegen.\n");
    	printf("\n");
    	printf("Eingabe:\n");
    	printf("Filmname:\n");
    	char* res = fgets(filmname, sizeof(filmname), stdin);
    
    }
    

    ciao

    ps: ist das ganze auch möglich mit einem dynamischem array? (okay, erstmal das ich das hier hinkriege)



  • hi schrieb:

    hi.
    ne leider nich. dann kommt nur das:
    *
    dean@gentoo diverses $ ./modbp
    FIDB - v. 0.1 - by err0r
    Bitte waehlen sie ein Menupunkt aus.
    1. FIDB lesen
    2. FIDB schreiben
    3. FIDB aendern

    2
    Film in die FIDB hinzufuegen.

    Eingabe:
    Filmn
    dean@gentoo diverses $:
    *

    und der code is so(das FILE *stdin auskommentiert):

    int fidbschr() /*in die db schreiben*/
    {
    #define MAX 101
    int menuafidbschr;
    /*FILE *stdin;*/
    char filmname[MAX];
    int filmnr, filmcodec, filmart, filmsource, filmfsk, filmdatum;
    	
    	printf("Film in die FIDB hinzufuegen.\n");
    	printf("\n");
    	printf("Eingabe:\n");
    	printf("Filmname:\n");
    	char* res = fgets(filmname, sizeof(filmname), stdin);
    
    }
    

    ciao

    ps: ist das ganze auch möglich mit einem dynamischem array? (okay, erstmal das ich das hier hinkriege)

    Dann hast du noch irgendwo anders einen Fehler, denn dieser Code ist, abgesehen davon, dass du nix returnst, richtig.



  • hi.

    okay dann hier der ganze code.
    ich finde aber kein fehler!

    /*
    FIDB ist ein Filmarchiv.
    Man kann Filmnamen, Art, Codec usw. eintragen und dies dann auch
    abspeichern, ausdrucken oder auch in eine sql db eintragen lassen.
    */
    
    #include <stdlib.h>
    #include <stdio.h>
    
    int fidblesen(); /*die db lesen*/
    int fidbschr(); /*in die db schreiben*/
    int fidbaen(); /*db ändern*/
    
    int main()
    
    {
    	int menua;
    
    	printf("FIDB - v. 0.1 - by err0r\n");
    
    	printf("Bitte waehlen sie ein Menupunkt aus.\n");
    	/*das menü*/
    	printf("1. FIDB lesen\n");
    	printf("2. FIDB schreiben\n");
    	printf("3. FIDB aendern\n");
    	/*printf("4. FIDB beenden\n"); nur bei windows*/
    	printf("\n");
    	scanf("%d",&menua);
    
    	switch(menua)
    	{
    		case 1: fidblesen();
    		break;
    
    		case 2: fidbschr();
    		break;
    
    		case 3: fidbaen();
    		break;
    
    		/*case 4: exit(0);
    		break; nur bei windows*/
    	}
    
    /*getch 0; nur bei windows*/
    } 
    
    int fidblesen() /*die db lesen*/
    {
    }
    int fidbschr() /*in die db schreiben*/
    {
    #define MAX 101
    int menuafidbschr;
    /*FILE *stdin;*/
    char filmname[MAX];
    int filmnr, filmcodec, filmart, filmsource, filmfsk, filmdatum;
    
    	printf("Film in die FIDB hinzufuegen.\n");
    	printf("\n");
    	printf("Eingabe:\n");
    	printf("Filmname:\n");
    	char* res = fgets(filmname, sizeof(filmname), stdin);
    
    }
    int fidbaen() /*db ändern*/
    {
    }
    

    Ciao


Anmelden zum Antworten