Status_access_violation



  • Hallo liebe Community,

    ich habe ein Programm erstellt, das bei einem eingegebenen Text
    die Länge jeder einzelner Token ermitteln soll und dadurch dann
    ausgibt wieviele Wörter einer bestimmten Wortlänge in diesem String enthalten sind.

    Nur leider bekomme ich immer ab einer gewissen Länge eines Wortes bzw. ab einer Stelle des Strings oder am Ende wenn er alle Token durch hat die Fehlermeldung "STATUS_ACCESS_VIOLATION"... ich suche schon seit Tagen, woran es liegt, komme aber auf keine richtige Antwort.
    Ich habe gelesen das es an den Pointern liegen kann, hat mich aber auch zu keinem Ergebniss gebracht.

    Hier einmal der Code meines Programms:

    #include <math.h>
    #include <string.h>
    #include <stdio.h>
    
    int main() {
        char sString[256];
        char *sWortlaenge;
        size_t iMaxlaenge;
        long int i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0, i9 = 0, i10 = 0, i11 = 0, i12 = 0,
                i13 = 0, i14 = 0, i15 = 0, i16 = 0, i17 = 0, i18 = 0, i19 = 0, i20 = 0, i21 = 0, i22 = 0, i23 = 0, i24 = 0, i25 = 0;
        char *point;
        char lang = *point;
    
        fgets(sString, 256, stdin); //Eingabe des zu bearbeiteten Strings
    
        sWortlaenge = strtok(sString, ". ,\0\n"); // erstes Token ermitteln
    
        while (sWortlaenge != NULL) {                       //Schleife, bis kein Wort mehr zur Bearbeitung steht
            printf("%s\n", sWortlaenge[1]);                 //Ausgabe, welches Wort im Moment bearbeitet wird
            sWortlaenge[1] = strtok(NULL, ". ,\0\n");      // weitere Token ermitteln
            strcpy(point, sWortlaenge);
            iMaxlaenge = strlen(sWortlaenge);              //Länge des Worte in "iMaxlaenge" speichern
    
            switch (iMaxlaenge)                            //Falls ein Wort z.B. 1 Buchstaben hat wird i1 um 1 erhöht
            {
                case 1: i1++;
                    break;
                case 2: i2++;
                    break;
                case 3: i3++;
                    break;
                case 4: i4++;
                    break;
                case 5: i5++;
                    break;
                case 6: i6++;
                    break;
                case 7: i7++;
                    break;
                case 8: i8++;
                    break;
                default:
                    break;
    
            }
    
        }
        fflush(NULL);
        fflush(stdin);
    
        //Ausgabe des Ergebnisses
        printf(" %d  %d  %d  %d  %d  %d  %d  %d  %d  %d  %d  %d  %d  %d  %d  %d\n", i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);
        printf("----------------------------------------------------------------\n");
        printf(" 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16\n");
    
        return (0);
    }
    

    Außerdem Versuche ich in der "letzten Ausgabe" ein Histogramm
    zu gestalten, nur weiß ich leider nicht wie ich das Graphisch hinkriegen soll.
    Denn für jedes Wort das in einer Kategorie vorhanden ist, soll ein Sternchen senkrecht eingereiht werden, sodass in Kategrorie z.B. wenn es davon 2 Wörter gibt, 2 Sternchen senkrecht übereinander stehen.

    Bitte um Rat für meine Tat. 🙂



  • Hallo Phenny.

    1. long int i[100];
    und nicht i1,i2,i3 etc.
    2. schau dir mal das an.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39338.html
    3. Den switch case kannst du nun so abkürzen: i[iMaxlaenge]++; Was auch das problem mit den zu Grossen Wortlängen lösen sollte.
    den printf kannst du nun auch in einer Schleife darstellen.



  • Wow, danke für die schnelle Antwort.
    Weißt du auch eine Antwort auf die Frage, wie ich das mit den Sternchen darstellen kann?
    Sodass die senkrecht aufgezeichnet werden pro Wort?



  • Was du mit 2. genau sagen willst, verstehe ich nur nicht ganz.
    Mein strtok ist doch richtig?
    Außer das ich keinen vordefinierten String benutze, sondern
    eine durch den Benutzer betätigte Eingabe.



  • strtok mit '\0' ist sinnlos.
    fflush(stdin) führt gemäß ANSI C zu undefiniertem Verhalten.
    fflush(NULL) habe ich noch nie gesehen, führt aber auch zu undefiniertem Verhalten.
    Die Eingabe des Strings bekommst du sicher selbst hin:

    #define MAXW 10
    
    void wlist(char *s,int *l)
    {
    	char *t;
    	for(t=strtok(s," .,\n");t;t=strtok(0," .,\n"))
    		if(*t && strlen(t)<=MAXW)
    			l[strlen(t)-1]++;
    }
    
    main()
    {
    	char x[]="1 22 333 4444 7 8 9 aaa xxx";
    	int i,weiter=1,lauf=0,l[MAXW]={0};
    
    	wlist(x,l);
    	for(i=0;i<MAXW;++i)
    		printf("%3d",i+1);
    	puts("");
    	while( weiter )
    	{
    		++lauf;weiter=0;
    		for(i=0;i<MAXW;++i)
    			printf("  %c",l[i]>=lauf?'*':' '),weiter=!weiter?l[i]>lauf:weiter;
    		puts("");
    	}
    	return 0;
    }
    


  • @wutz

    Zeile 24 ist ja Horror ... wo hast du das denn ausgegraben?



  • Ich verstehe nurnich, warum das alles so große Probleme mit fgets macht?
    Und warum jeder immer einen vordefinierten Satz hernimmt.



  • So Ihr beiden,

    vielen Dank für eure Hilfe. Nun haben "wir" es ja endlich geschafft. 😉
    Ich habe nun einfach

    char x[256];
        int i, weiter = 1, lauf = 0, l[MAXW] = {0};
        printf("Schreiben Sie ihren Text: \n");
        gets(x); //Eingabe des zu bearbeitenden Textes
    

    eingebaut um eine benutzerdefinierte Eingabe bearbeiten zu lassen.
    Ihr habt mir eine "meeeeeeenge" Zeit gespart. 🙂
    Also, vielen Dank nochmal.



  • Übrigens,

    kann man in deine Zeile "24" auch etwas einbauen,
    das falls es bei einer Wortlänge über 7 Stück gibt,
    das er die Anzahl dann halt irgendwie am Schluss unten hinschreibt?



  • Das hier:

    char *sWortlaenge;
    
        /* ... */
    
            sWortlaenge[1] = strtok(NULL, ". ,\0\n");
    

    ist problematisch. Das gleiche gilt für das hier:

    char *point;
        char lang = *point;
    
        /* ... */
    
            /* point ist hier immer noch nicht initialisiert */
            strcpy(point, sWortlaenge);
    


  • Ich bin halt leider noch etwas im "Anfängerstadium"
    und lerne alles gerade noch kennen.^^ 😋



  • Phenny schrieb:

    Übrigens,

    kann man in deine Zeile "24" auch etwas einbauen,
    das falls es bei einer Wortlänge über 7 Stück gibt,
    das er die Anzahl dann halt irgendwie am Schluss unten hinschreibt?

    Ja, unter die while-Schleife:

    if( lauf>7 ) printf("Mehr als 7, nämlich: %d\n",lauf);
    


  • Danke dir recht herzlich 🙂

    *keks geb* 😃



  • Phenny schrieb:

    gets(x); //Eingabe des zu bearbeitenden Textes

    Dein 1.Versuch war schon besser, da fgets mit Bereichsüberprüfung arbeitet, also nimm ihn halt wieder:

    fgets(sString, 256, stdin);
    


  • Ein bisschen anders dachte ich eigentlich.

    Und zwar halt z.B. so (ist echt schwer umzusetzen)

    1 2 3 4 5 6 7 8 9 10
    -----------------------------
    * * * *
    * * *
    * *
    *
    -----------------------------
    3 4

    ich weiß, dass klingt echt dämlich 😕



  • Das Problem mit fgets bei mir ist, dass
    er mir dann wieder mit den doofen Pointern to Integer kommt und dem
    gewusel. Und ich hab so meine Probleme mit den Pointern^^



  • Phenny schrieb:

    Und ich hab so meine Probleme mit den Pointern^^

    Das geht jedem Anfänger so.
    Also dann:

    char x[256];
    ...
    fgets(x,sizeof x,stdin);
    ...
    


  • Oh mein Gott,

    warum bin ich bloß nicht auf "sizeof" gekommen? 😕
    Ich glaube nämlich, dass ich das schon einmal benutzt habe.

    Gibt es auch eine so simple Lösung für das andere Problem?



  • Was für ein anderes Problem?



  • Phenny schrieb:

    Ein bisschen anders dachte ich eigentlich.

    Und zwar halt z.B. so (ist echt schwer umzusetzen)

    1 2 3 4 5 6 7 8 9 10
    -----------------------------
    * * * *
    * * *
    * *
    *
    -----------------------------
    3 4 //Zeigt an wieviele Wörter die
    //entsprechende Anzahl an Buchstaben
    //haben und zählt sie auf, falls
    //es sonst zuviele Sternchen werden

    ich weiß, dass klingt echt dämlich 😕

    Das Problem :p



  • Phenny schrieb:

    -----------------------------
    3 4 //Zeigt an wieviele Wörter die
    //entsprechende Anzahl an Buchstaben
    //haben und zählt sie auf, falls
    //es sonst zuviele Sternchen werden

    char strtmp[10];
    ...
    for(i=0;i<MAXW;++i)
      printf("%3s",l[i]>7?_itoa(l[i],strtmp,10):"");
    

    wobei _itoa kein ANSI C mehr ist.


Anmelden zum Antworten