Unbehandelte Ausnahme bei 0x771715de



  • Hallo Leute,

    ich hab ne Frage. Ich bin noch in den absoluten Grundzuegen der C-Programmierung. Nun moechte ich, wie viele vorher sicher auch schon dieses Prgramm Woerterraten erstellen 🙂

    Nun habe ich u.a. folgendes Problem. Mit meiner Methode kann man soweit ohne Probleme den ersten Buchstaben abfragen.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <conio.h>
    #include <windows.h>
    #include "privHead.h"
    #include "typDef.h"
    
    typ_proto *listanf=0, *listend=0, *listakt=0;	/*globale zeiger*/
    
    #define BUF 255
    
    char temp[BUF];
    char puffer[BUF];
    
    char *getsline_number(int n, FILE *file) 
    {
       int i;
    
       for(i = 0; i < n-1; i++)
          if(fgets(temp, BUF, file) == NULL)
             /* Bis zur n-ten Zeile lesen */
             return NULL; /* Zeile scheint nicht zu existieren. */
       /* Stream ist jetzt in der n-ten Zeile. */
       if(fgets(puffer,BUF,file) == NULL)
          return NULL; /* Zeile scheint nicht zu existieren. */
       return puffer; /* Zeile an Aufrufer zurückgeben */
    }
    
    /*#################  MAIN  ####################*/
    
    int main (void)
    {
    	char wortliste[20];
    	char protokoll[20];
    	char abfrage[2];
    	char linenr[20];
    
    	printf ("Wortliste eingeben: ");
    	scanf("%s", wortliste);
    
    //	printf ("Protokolldatei eingeben: ");
    //	scanf("%s", protokoll);
    
    //	printf("Grossschreibung beachten? [j/n]" );
    //	scanf("%s", abfrage);
    
    //	printf("%s\n", wortliste);
    //	printf("%s\n", protokoll);
    //	printf("%s\n", abfrage);
    
    	lesedatei (wortliste);
    
    	printf("\n\n\nTest");
    
    	fflush(stdin);
    	getchar();
    	return 0;
    }
    
    /*#################  Datei lesen  ####################*/
    
    int lesedatei( char *wortliste)
    
    {
    
    	int i=0;
    
    	FILE *fptr_eing;
    
    	char *wort;
    	unsigned int line=0;
    	char *linenr;
    
    	time_t t;
        time(&t);
        srand((unsigned int)t);  //initial. Zufallszahl
    
    	//Datei einlesen
    	fptr_eing = fopen(wortliste,"r");
    	if( (fptr_eing=fopen(wortliste, "r") ) ==NULL )
    	{
       		fehlerbehandlung( -1, "lesedatei");
    		return -1;
    	}
    
    //  fscanf (fptr_eing, "%100c", wort);
    //	wort[125]='\0';
    
    	//Wort aus Datei auslesen und ausgeben
    	line=rand()%9+1;
    	wort=getsline_number(line, fptr_eing);
    	printf("\nDatei: %s\n", wortliste);
    	printf("\n\n");
    	printf("Wort: %s", wort);
    
    	umwandeln(wort);
    
    	//listakt=listanf;
    	fclose(fptr_eing);
    
    	printf("\n");printf("  *");
    	printf(" Datei eingelesen.");
    	return 0;
    }
    
    /*#################  Zeichen in "---" ausgeben  ####################*/
    
    int umwandeln(char *wort)
    {
    
    	char wortneu[25]={0}, *ptr_wortneu=wortneu;
    	int i;
    	size_t laenge;
    
    //	Laenge des Wortes ermitteln
    	laenge=strlen(wort)-1;
    
    // Wort in "---" wandeln
    	for(i=0; i<laenge; i++)
    	{
    		*ptr_wortneu='-';
    		ptr_wortneu++;
    	}
    	printf("\nWort verdeckt: %s\n\n",wortneu);
    
    	suche(wort);
    
    	return 0;
    }
    
    /*#################  Buchstaben suchen  ####################*/
    
    int suche (char *wort)
    {
    	fflush (stdin);
    	char buchstabe={0};
    	char feld2[25]={0}, *ptr_feld2=feld2;
    	char str3[25]={0}, *ptr_wort=str3;
    	char str4[25]={0}, *ptr_str4=str3;
    
    	int i;
    	size_t laenge=0;
    
    //	Laenge des Wortes ermitteln
    	laenge=strlen(wort)-1;
    
    	while(*wort!='\0')
    	{
    		*ptr_wort=*wort;
    		ptr_wort++;
    		wort++;
    	}
    
    //	Gesuchten Buchstaben abfragen
    	printf("Bitte geben Sie den zu suchenden Buchstaben ein: "); fflush(stdin);	buchstabe=getchar();
    	/*
    	if ((buchstabe  <=97  || buchstabe>= 122)&&(buchstabe <=65)||(buchstabe>=90) )
    	{
    		printf ("Bitte einen Buchstaben eingeben\n");
    		return 0;
    	}
    	*/
    
    //	Nach Buchstaben im Wort suchen	
    	for(i=0; i<laenge; i++)
    			{
    	if (*ptr_str4==buchstabe)
    		{
    		*ptr_feld2=buchstabe;
    		ptr_feld2++;
    
    		}
    	else 
    		{
    		*ptr_feld2='-';
    		ptr_feld2++;
    		}
    	ptr_str4++;
    	}
    
    //	Wort mit gefundenem Buchstaben ausgeben
    	printf("\nNeuer Text: %s\n",feld2);
    	printf("\nNeuer Text2: %s\n", str3);
    	printf("\n");
    	int ret = strcmp(feld2, str3);
    	if (ret!=0){suche(wort);}
    return 0;
    }
    
    /*
    int schreibedatei(char *wortliste){
    
    	//typ_buch *hilf=listakt;
    
    	/*FILE Datentyp aus stdio.h
    	//FILE *fptr_ausg;  /*zeiger auf datentraeger
    
       if(listanf==0)return 0; /*list leer, nicht schreiben
    
       if((fptr_ausg=fopen(datei, "w"))==NULL){
          fehlerbehandlung( -2, "schreibedatei");
       	return -1; /*w fuer schreiben, test
       }
    
       listakt=listanf;
    
       while(listakt!=0){
       	list2struct();
          fwrite((char*)&buch, sizeof(buch), 1, fptr_ausg);
          listakt=listakt->danach;
       }
    
       fclose(fptr_ausg);
       listakt=hilf;
    
       printf("\n");printf("  *");
       printf(" Datei geschrieben.");
    return 0;
    }
    
    */
    
    /*#################  Fehlerbehandlung  ####################*/
    
    void fehlerbehandlung( int fehlernum, char *function)
    {
    
    	char fehlermeld[4][60+1]={"Fehler beim Oeffnen der Datei",
       							     "Fehler beim Schreiben der Datei",
                                 "Fehler beim Lesen der Datei",
    	                          "Fehler bei Speicheranforderung"};
       //clrscr();
       fehlernum=-fehlernum-1;
       if (fehlernum<0 || fehlernum>3){
       	printf("Falsche Fehlernummer!");return;}
    
       printf("\n ");printf(" *");
       printf(" %s (Funktion %s)!",fehlermeld[fehlernum], function);
       perror(function);
    }
    /* Standardfehlermeldung SYSTEM perror(Funktion)
    Fehlernummern fopen -1, fwrite -3, fread -3, malloc -4*/
    

    Wenn ich allerdings die Funktion

    int suche (char *wort)
    

    ein zweites Mal durchlaufen lasse, kommt nach der Buchstabenabfrage die Meldung

    Unbehandelte Ausnahme bei 0x771715de in beleg_v0.2.exe: 0xC0000005: Access violation.

    Ich habe sicher irgendnen grundlegendenn Fehler drin, aber ich tu mich echt schwer 🙄

    Waere coolio, wenn mir jemand helfen koennte.

    Gruss Alex



  • Sehr verworren das Ganze.
    In Zeile 214 ist wort nicht mehr das wort aus Zeile 158, da du wort in Zeile 177 veränderst.

    Was du in den Zeilen 173-178 machst erledigt strcpy für dich, ohne den Zeiger wort zu ändern.

    Du hast ein mächtiges Problem beim Verständnis von Arrays und Zeiger.
    Du kannst das Problem komplett in der Arrayschreibweise lösen (also mit []).

    Dann noch etwas:
    verzichte auf globale Variablen.
    Eine Funktion macht eine Sache. lesedatei , liest die Datei und sollte nicht umwandeln aufrufen.
    umwandeln sollte nicht suche aufrufen.
    Rekursion (Aufruf von suche in suche ) macht das Ganze auch nicht einfacher.
    srand nur einmal im ganzen Programm aufrufen (am besten in main)


Anmelden zum Antworten