u.a. Strings/Arrays



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



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


Anmelden zum Antworten