strtok



  • Hallo,

    Ich habe ein Problem mit einem Teil meines Programmes. Es soll aus einer Datei jede Zeile rauspicken, mithilfe der Funktion strtok in die einzelnen Wörter in ihre Bestandteile gelegt werden un mit der anschließend mit hilfe der Fkt strcpy in denn Jeweiligen Array gespeichert werden.

    Inhalt der Datei:
    be;was;been;sein;
    beat;beat;beaten;schlagen;
    become;became;become;werden;
    begin;began;begun;beginnen;
    bet;bet;bet;wetten;
    blow;blew;blown;blasen;
    break;broke;broken;zerbrechen;
    bring;brought;brought;bringen;

    Wenn ich die Testausgaben auskommentiere(hier auskommentiert) um mir den Inhalt des einzelner Arrays anzuzeigen verwundert mich die ausgabe. Teilweiße fehlen Zeichen die zu einem Wort gehören und diese werden in dern nächsten Zeile ausgegeben.

    Ausgabe:
    be was been sein
    beat beat beaten schlage
    n
    become became begun beginn
    en

    Währe sehr dankbar wenn mir jmd weiterhelfen könnte 😕

    Vielen Dank,
    helly

    Hier der der betreffende Code:

    //-----------------------------------------------------------------------------------------
    	//Vocabeln aus Datei Lesen und in Arrays abspeichern:
    	//-----------------------------------------------------------------------------------------
    	//Datei oeffnen: "unReVe.txt"
    	 datei = fopen ("unReVe.txt", "r");
    	 //Hat es geklapt? Wenn nicht dann :		
    
    	if (datei == NULL){
    		printf("Fehler beim oeffnen der Datei.");
    
    	}else{
    	//Wenn es geklappt hat die Datei zu oeffnen
    		while(!feof(datei)){//Solange Datei nicht am Ende ist:
    			fgets(row, WORTLAENGE, datei);
    			//printf("%i) %s", i, row);														//Testausgabe
    			//i++;
    			//Zum ermitteln des ersten Tokens
    			 ptr = strtok(row, ";");
    			  for(i=0; ptr != NULL; i++) {
    				  //Testausgabe
    					/*printf("% d. Wort: %s\n",i++,ptr);*/
    
    						if(i==0){							
    							 strcpy (arrInf[i],ptr);
    								printf("%s\t", arrInf[i]);/*Testausgabe*/
    						}else if(i == 1){			
    							 strcpy (arrSp[i],ptr);
    								printf("%s\t", arrSp[i]);/*Testausgabe*/
    						}else if(i == 2){				
    							 strcpy (arrPp[i],ptr);
    								printf("%s\t", arrPp[i]);/*Testausgabe*/
    						}else if(i == 3){				
    							 strcpy (arrDe[i],ptr);
    								printf("%s\n", arrDe[i]);/*Testausgabe*/
    						}
    				//Zum ermitteln weiterer Tokens:
    				ptr = strtok(NULL, ";");
    			  }	//Ende for-Schleife  "for(i=0; ptr != NULL; i++)"
    		}//Ende while
    	}//Ende Else
    	//Datei schließen:
    	fclose(datei);
    


  • Was ist WORTLAENGE?



  • Erstmal sorry für für Doppelpost, habe mich eben erst regestriert.
    Habe den Fehler gefunden, die Arrays hatten die Falsche laenge 😞 ..
    klappt nun,

    Danke

    //Zeilen in der Datei
    	#define ROWS 86
    	//Maximale Anzahl Buchstabe pro Wort:
    	#define WORTLAENGE 50
    

    WORTLAENGE war davor 25, das war zu kurz



  • D.h. das Problem tritt jetzt auf, wenn deine Zeilen länger als 50 Zeichen sind, statt 25!? Und was passiert, wenn die Datei mehr als 86 Zeilen hat?



  • Ja, dann würde es wieder passieren, aber ich muss ja dem Array zu beginn eine Laenge mitgeben und kann diese nicht während der Laufzeit ermitteln.

    Wenn die Datei mehr als 86 Zeilen hat werden die Danach nicht mehr beachtet. Da ich die Datei selbst anlege sollte das vorerst reichen, oder nicht?



  • Und wenn die Datei länger wird, musst du das Programm ändern?

    Wirf mal einen Blick auf malloc(). 😉



  • Bin gerade dabei, nur mal so zum Verständniss;
    Um die Dateilaenge zu bestimmen, muss ich einmal in die Datei, einmal durchlafen und dabei die Anzahl der Reihen bis "EndofFile" lesen. zu diesem Wert mus ich noch Eins Addieren.

    Es schaut jetz so aus:

    if (datei == NULL){
    		printf("Fehler beim oeffnen der Datei.");
    		system("pause");
    		return 0;		
    	}else{
    		while(!feof(datei)){//Solange Datei nicht am Ende ist:
    			fgets(row, WORTLAENGE, datei);
    			j++;
    		}
    	value= (char*)malloc((j+1)*sizeof(char));
    		if( NULL == value ) {
    		printf("Fehler bei malloc....\n");
    		system(pause);
    		return 0;
    		}
    
    	}
    

    dammit hätte ich jetz einen Array mit der 1 D mit der anzahl der Reihen in der Datei, oder nicht?

    E:
    Mir ist es nicht klar wie ich es für ein 2D Array machen muss.
    Wenn ich mir jede Zeile der Datei hole und schaue welche die längste ist, würde dies dan theo. funktionieren?



  • Ja, alternativ kannst du aber natürlich z.B. erstmal ein Array gewisser Größe anlegen und, wenn dieses während dem Einlesen zu klein wird, ein neues, größeres anlegen, die Daten rüber kopieren und das alte freigeben. Apropos freigeben: Speicher den du mit malloc() anforderst, musst du auch mit free() wieder freigeben. Die Funktion realloc() ist möglicherweise auch hilfreich...



  • Da mich das etwas verwirrt mit 2D Arrays werde, ich erstaml das Programm so fertig machen, Also für festgelegt Laengen.

    EDIT:

    Habe nun wieder ein Problem:
    Ich wollte verschiedene Elemente aus einem Array ausgeben.
    Jedoch verhauts bei mir die Ausgabe(Zeile 100 bis 105) komplett und weiß nicht warum.
    Bei den Testausgaben Zeilen: 85,88,91,94 haben die Felder den Richtigen Inhalt
    Hat jmd eine Idee?

    EDIT:
    Ich habs jetz verändert, ich habe nun eine Verschachtelte Schleife gemacht, da er bei nur eine for Schleife, die Wörter immer in das gleiche Array geschrieben hat.
    Nun schauen aber beide Testausgaben sehr selstsam aus.
    bei der Testausgabe 102 bis 105 gibt er mich auch immer das gleiche Wort zurück.

    Hier noch ein Bild von der Ausgabe:
    http://up.picr.de/13116853bt.png

    #include <stdlib.h>
    #include <time.h>
    #include <stdio.h>
    #include <string.h>
    
    #include "fillArray.h"
    	//Zeilen in der Datei
    	#define ROWS 86
    	//Maximale Anzahl Buchstabe pro Wort:
    	#define WORTLAENGE 55	
    
    //Startet den Test über Unregelmäßigen Verben.
    void startUnRegVeTest(void){
    
    	//Hier steh die Zeile die aus der Datei gelessen wurde.
    	char row[ROWS];
    	//IN diesen 2D-Arrays stehen die aus Datei gelessenen Wörter getrennt:
    	char arrDe[ROWS][WORTLAENGE];//Deutsche übersetzung
    	char arrInf[ROWS][WORTLAENGE];// Infintiv Eng
    	char arrSp[ROWS][WORTLAENGE];// Simple past Eng
    	char arrPp[ROWS][WORTLAENGE];// Past Particle Eng;
    	//Für strtik:
    	char *ptr;
            	//Hier steht die gewählte ANzahl der ABfragungen
    	int anz;
    	int k=0;
            //i ist die Zählvariable
    	int i=0;
    
    	if (datei == NULL){
    		printf("Fehler beim oeffnen der Datei.");
    
    	}else{
    	//Wenn es geklappt hat die Datei zu oeffnen
    
    		while(!feof(datei)){//Solange Datei nicht am Ende ist:
    			fgets(row, WORTLAENGE, datei);
    			//printf("%i) %s", i, row);														//Testausgabe
    			//i++;
    			//Zum ermitteln des ersten Tokens
    			 ptr = strtok(row, ";");
    			 for(k=0;k<anz;k++){
    				  for(i=0; ptr != NULL; i++) {
    					  //Testausgabe
    						/*printf("% d. Wort: %s\n",i++,ptr);*/
    
    							if(i==0){							
    								 strcpy (arrInf[k],ptr);
    									printf("%s\t", arrInf[k]);/*Testausgabe*/
    							}else if(i == 1){			
    								 strcpy (arrSp[i],ptr);
    									printf("%s\t", arrSp[k]);/*Testausgabe*/
    							}else if(i == 2){				
    								 strcpy (arrPp[i],ptr);
    									printf("%s\t", arrPp[k]);/*Testausgabe*/
    							}else if(i == 3){				
    								 strcpy (arrDe[i],ptr);
    									printf("%s\n", arrDe[k]);/*Testausgabe*/
    							}
    
    					//Zum ermitteln weiterer Tokens:
    					ptr = strtok(NULL, ";\t ");
    				  }	//Ende for-Schleife  "for(i=0; ptr != NULL; i++)"
    			 }
    		}//Ende while					printf("%s\n", arrDe[0]);/*Testausgabe*/
    						printf("%s\n", arrDe[1]);/*Testausgabe*/
    						printf("%s\n", arrDe[2]);/*Testausgabe*/
    						printf("%s\n", arrDe[3]);/*Testausgabe*/
    						printf("%s\n", arrDe[4]);/*Testausgabe*/
    	}//Ende Else
    	//Datei schließen:
    	fclose(datei); 
    system("pause");
    }
    

Anmelden zum Antworten