u.a. Strings/Arrays



  • Außerdem sind deine sizeof(char) total überflüssig

    aber auch nur weil im standard steht das sizeof(char) 1 ist. wenn das mal geändert werden sollte, ist mein code anpassungfähiger 😃 (ok flache begründung ich habs mir halt so angewöhnt weils nicht schadet.

    sizeof wird ja auch schon zur kompilzeit ausgewertet so das der code in der ausführung nicht langsamer wird

    greetz Windalf



  • Naja, so richtig rennt es noch nicht... Vielleicht findet ja noch jemand ein oder zwei Fehler in meinem zuletzt geposteten Code. Würde mich auf jeden Fall freuen.



  • Also wenn ich jetzt nochmal deinen Parameter "in" in der while()-Schleife finde, dann bekommst du Anschiss. 😉

    evil411 schrieb:

    ...
    		strncpy(buffer, in, pos-oldpos);			// Kopiere von alter Position bis Position des Suchstrings nach buffer
    ...
    

    Da gehört nicht in hin sondern oldpos! Dein Parameter in gehört überhaupt nicht in die Schleife rein, dafür hast du ja oldpos.



  • Also ich habe den Code jetzt folgendermaßen:

    char* ersetzen(const char* re, const char* repl, char* in, char* buffer)
    {
    	char *pos, *oldpos, buffer2[STR_MAX];
    	long len_buf;
    
    	pos = strstr(in , re);		// suche den Suchstring im Input
    
    	if(!pos) 
    	{ 
            return in;
    
    	}
    
    	oldpos = in;				// die alte Position speichern (hier noch Anfang)
    
    	*buffer=0;					// buffer mit 0 initialisieren
    	*buffer2=0;
    	 while(pos)                    // sobald der Suchstring gefunden wurde 
        { 
    		printf("--->pos---->%s\n",pos);
            len_buf = strlen(buffer);			// len_buf wird die Länge vom Buffer zugeordnet 
    
            strncpy(buffer, oldpos, pos-oldpos);            // Kopiere von alter Position bis Position des Suchstrings nach buffer 
    
            buffer[len_buf +pos - oldpos] = '\0';        // Stringendezeichen setzen 
    
            oldpos = pos+strlen(re);    // Position nach Suchstring im Text ermitteln 
    
            char buffer2[STR_MAX];  // buffer2 für Rest erzeugen 
    
            memset(buffer2,0,strlen(buffer2)); //mit 0 vorbelegen
            printf("--->buffer---->%s\n",buffer);
    
    		strcpy(buffer2,strstr(in,re)+strlen(re));        // den Rest in buffer2 kopieren 
            printf("--->buffer2--->%s\n",buffer2);
    
    		strcat(buffer, repl);        // kopiere den zu ersetzenden String an die Stelle wo der alte gefunden wurde 
    
            strcat(buffer, buffer2);    
    
            memset(buffer2,0,strlen(buffer2)); 
    
            oldpos =pos + strlen(re);    // Position nach Suchstring im Text ermitteln 
    
            pos = strstr(oldpos,re);    //Suche nach weiteren Suchstring in Text hinter letzten gefundenen Suchstring 
    
            printf("\n");
        } 
    
        strcat(buffer, oldpos);        // den Rest an die Position nach der Ersetzung kopieren        
    
        return buffer; 
    
    }
    

    Aber wenn ich jetzt z.B. so einen String übergebe:

    Dieser String ist ein Test ist
    

    ...und versuche das ist durch ERSETZT zu ersetzen, dann kommt das raus:

    ein Test ing ERSETZT ein Test istERSETZT ein Test ist
    

    ...WARUM??? 😕



  • Du produzierst ja immer mehr Chaos rein. 😮

    Was soll dieser buffer2 und dann auch noch mitten im Kontext deklariert. 😮

    Fang nochmal mit deinem 1. Code hier drin an:

    char* ersetzen(const char* re, const char* repl, char* in, char* buffer)
    {
        char *pos, *oldpos;
        int len_buf;
    
        pos = strstr(in , re);        // suche den Suchstring im Input
        printf("Position: %s\n", pos);
        if(!pos)
        {
           strcpy(buffer, in);
    
            return(buffer);
    
        }
    
        oldpos = in;                // die alte Position speichern (hier noch Anfang)
        printf("Alte Position: %s\n", oldpos);
    
        *buffer=0;                    // buffer mit 0 initialisieren
    
        while(pos)                    // sobald der Suchstring gefunden wurde
        {
            printf("Testausgabe");
            len_buf = strlen(buffer);    // len_buf wird die Länge vom Buffer zugeordnet
            printf("Bufferlänge: %d\n", len_buf);
    
            strncpy(buffer+len_buf, oldpos, pos-oldpos);    // Kopiere von alter Position bis Position des Suchstrings nach buffer
            //printf(buffer);                                       
            buffer[len_buf+pos-oldpos] = 0;        // Stringendezeichen setzen
    
            strcat(buffer, repl);    // kopiere den zu ersetzenden String an die Stelle wo der alte gefunden wurde
    
            oldpos = pos + strlen(re);    // Position nach Suchstring im Text ermitteln
    
            pos = strstr(oldpos,re);    //Suche nach weiteren Suchstring in Text hinter letzten gefundenen Suchstring
    
        }
    
        strcat(buffer, oldpos);        // den Rest an die Position nach der Ersetzung kopieren
        return(buffer);
    }
    

    Die Fehler, die ich damals schon gesehen habe, hab ich gleich rausgemacht. Der Code sollte also funktionieren. Wenn nicht, schreib nochmal.



  • Funktioniert aber leider immer noch nicht...
    Wenn ich immer noch diesen String hier eingebe und "ist" durch "ERSETZT" ersetzen will:

    Dieser String ist ein Test ist
    

    Dann kommt dieser raus:

    ein Test ing ERSETZTERSETZT
    

    Wenn ich das aber mit dem gleichen String ohne dem letzten "ist" probiere, dann klappts. Ich weiß auch nicht warum...



  • Hab anscheinend doch noch einen Fehler übersehen.
    Du hast mit strncpy() immer an den Anfang von buffer was kopiert, was ja nicht immer richtig ist ;). Hab es oben korrigiert, probiers nochmal.



  • Danke 😉
    Genauso sollte es funktionieren. Es hat wirklich daran gelegen... 🤡



  • habe jetzt nur noch ein Problem:
    und zwar haut das mit dem ersetzen jetzt gut hin, aber wenn ich jetzt anstatt dem inp (das ja kurz vor Funktionsaufruf generiert wurde:

    char inp[]="das ist ein Test";
    

    )
    ... einen anderen InputString nehme, in meinem Beispiel ein String der aus einer Datei eingelesen wurde,funktioniert es nicht.
    Dieser InputString besteht nur aus einer Zeile, sollte also Problemlos klappen. Es klappt aber nur wenn der zu ersetzende String länger bzw. gleich lang ist wie der einzusetzende. Andererseits haut es nicht hin wenn ich z.B. in diesem InputString "ist" durch "ist2" ersetzen will. (wenn ich es andersherum ersetzen würde, dann würde es klappen)
    Woran kann das noch liegen?
    P.S. mein Input hat vorher 100000 Zeichen. Selbst wenn ich anschließend mit buffer weiterarbeite, klappts nicht. Nur wenn der zu ersetzende String kürzer ist... 😕 😕 😕 😕 😕 😕 😕 😕 😕 😕



  • Zeig mal bitte die Aufrufe von ersetzen() und die Deklarationen der verwendeten Variablen.



  • OK, hier ein paar Ausschnitte, die wichtig sein sollten:

    #define MAX_LEN 100000
    char inputline[MAX_LEN];
    ...
    

    inputline wird aus einer Datei ausgelesen...
    und dann folgender Funktionsaufruf:

    char buffer[STR_MAX];
    ersetzen("\"|\"|","qm|",inputline, buffer);
    		printf(buffer);
    

    ... und mein Inputline ist genau 1 Zeile mit ziemlich vielen Zeichen und Buchstaben (MAX. 100000)



  • Wie groß ist STR_MAX?

    Möglicherweise ist len_buf das Problem bzw. dessen Typ. Verwende mal anstatt int den Typ long.
    Ansonsten solltest du mal den Debugger anschmeissen (dein bester Freund).

    Übrigens noch was:

    printf(buffer); => falsch bzw. kann leicht zu Fehlern führen (man bedenke nur, da steht ein % im String drin ;))
    printf("%s", buffer); => richtig



  • Klappt so leider auch nicht wenn ich aus int long mache...
    Mein STR_MAX ist auch 100000 groß... Woran könnte es noch liegen??? 😕



  • 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 😕


Anmelden zum Antworten