u.a. Strings/Arrays



  • Was genau funktioniert bzw. klappt eigentlich nicht?



  • na wie bereits gesagt habe ich ein char inp[100000] und ein char buffer[100000]. In inp wird ne Datei eingelesen, welche nur aus einer zeile besteht.
    Wenn ich jetzt meine ersetzen-Funktion so aufrufe:

    ersetzen("hallo","Tag",inp,buffer);
    

    dann funktioniert es, weil hallo(5 Zeichen) entfernt und Tag (3 Zeichen) hinzugefügt wird. Wenn ich aber jetzt die Funktion z.B. so aufrufen würde:

    ersetzen("hallo","Guten_Tag",inp,buffer);
    

    ... dann würde es nicht klappen und ein Speicherfehler entstehen... Vielleicht ist irgendein Array zu klein oder so 😕 , aber ich habe alle Größen schon mal versucht zu ändern... Der Debugger hilft mir auch nicht weiter...

    P.S. Also wie gesagt ist mein inp relativ gross, wenn ich z.B. anstatt Inp einen String (char test[]="hallo sie, ja sie, hallo";) übergeben würde, dann gibt es keinen Speicherfehler und ich kann hallo ohne Probleme durch Guten_Tag ersetzen.



  • Ja dann liegt es Nahe, dass du nicht genügend Speicher reserviert hast. Hast du schon mal überprüft, wie lang dein String ist, den du in inp einliest?

    Der Debugger kann dir da schon helfen. Du siehst z. b. genau an welcher Stelle im Code das Programm aussteigt.



  • na auf jeden Fall reichen 100000 Zeichen aus. so lang ist mein inp nun auch wieder nicht. Es kann zwar durchaus mal sein, dass er wirklich über 100000 groß ist, aber selbst bei nem kurzen inp geht es nicht. (ich habe ja mehrere Testdateien) Welcher Speicher wird denn dann nicht reichen???



  • @ AJ
    ... aber du hattest recht, wenn ich einen wesentlich kleineren String nehme (bzw. einfach aus meiner Datei, die ich einlese, was lösche) dann funktioniert es. Was meinst du welcher Speicher da nicht reicht? Habe alle schon zu testzwecken mal verdoppelt. (alle zusammen aber auch alle einzeln) 🕶



  • Könntest du mal deinen kompletten Quellcode posten (vorrausgesetzt er ist nicht zu groß; wenn ja, dann poste nur mal einen Teil davon (hauptsächlich: Deklarationen, Einlesen der Datei, Aufruf von ersetzen, restliche Sachen, die mit dem eingelesenen passieren)).



  • also der gesamte Code ist ganz schön lang. Ich poste mal die wichtigsten Stellen: (vor allem den Anfang bis zum Funktionsaufruf)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include "private.h"
    
    #define MAX_LEN 100000
    #define ARY_MAX 1000
    
    char* ersetzen(const char* re, const char* repl, const char* in, char* buf);
    
    int main(int argc, char *argv[])
    {
    	// Variablendeklarationen, -definitionen
    	FILE *file;
    	char inp[MAX_LEN], temp[MAX_LEN]; 
    	int len=0, i=0, p=0, c=0, k=0, 
    
    	// Fehlerhandling -> Werden Parameter beim Programmaufruf mitgegeben ?
    	if(argc < 2) 
    	{
    		file=stdin;
    	}
    	else
    	{
    		// Datei öffnen
    		file=fopen(argv[1],"r");
    
    		// Fehlerhandling -> Kann die Datei nicht geöffnet werden
    		if (file == NULL)
    		{
    			printf("Error\n");
    			return 1;	
    		}
    	}
    
    	// Strings werden mit ' ' vorbelegt
    	memset(inp ,0,sizeof(inputline));   
    
    	// Überprüfung, ob eine Zeile in der Datei vorhanden ist
    	while ( fgets (inp, MAX_LEN, file) != NULL )
    	{
    		len = strlen(inp);	// die Länge der Eingabezeile wird ausgelesen
    	         	char buf[STR_MAX];
    		ersetzen("UST","ustust",inp, buf);
    		//printf("Inp:   %s",buf);
    ...
    ...
    ...
    

    So, hier unten passiert jetzt noch einiges (Aufruf einiger Fkten), was aber in jedem Fall funktioniert, wurde schon getestet... da muss der fehler wohl bis hierher schon geschehen sein 😕



  • ... bei memset muss in die Klammer natürlich inp, habe ich auch eigentlich so 😃



  • Dieses char buf[STR_MAX] mitten im Kontext gefällt mir nicht (ist auch kein ANSI-C).

    Deklariere buf mal bitte mit den anderen Variablen ganz oben und am besten gleich so: char buf[MAX_LEN];

    Das memset zum vorbelegen von inp kannst du dir sparen.

    Arbeitest du nach dem Aufruf von ersetzen noch mit inp weiter oder mit buf? Wo in deinem Quellcode steigt eigentlich das Programm aus? (-> Debugger)



  • Ja, anschließend benutze ich den inp um damit noch eine Funktion aufzurufen (in meinem Falle eine Funktion zum Teilen bzw. Strukturieren des Strings, die aber 100%ig funzt).
    Wie gesagt, wenn ich mit debugger arbeite komme ich nicht so wirklich klar. Auf jeden Fall konnte ich aber erkennen, dass ich lediglich bis zum Beginn der while-Schleife im Einzelschritt debuggen konnte.



  • 🙂 ich glaub ich weiß woran es liegen könnte. Setz mal bei MAX_LEN anstatt den 100.000 mal 30.000 ein.



  • Ich habe den Fehler gefunden... Und zwar liegt das an meine Variable len. Diese hat sich anfangs daraus ergeben, dass len = strlen(inputline) war... Nach der Funktion ersetzen benötigte ich aber len noch einmal, obwohl es nach dem ersetzen wesentlich größer sein müsste. Deshalb musste ich einfach nach der ersetzung noch einmal schreiben len=strlen(buffer).
    Deshalb hat das mit einem kürzeren String funktioniert und so nicht...
    😃 😃 😃 😃 😃 😃 😃 😃

    So, jetzt bin ich wirklich fertig, werde euch wegen dieser sch... Aufgabe nicht mehr belästigen... Danke an alle die geholfen haben... 👍


Anmelden zum Antworten