Pointer und Char.



  • Erstmal auf die Schnelle

    Nimm aussagekräftigere Variablennamen. Z.B. zu strSearch -> lenSearch usw.

    Wie gesagt Hilfszeiger:

    char *Hilfszeiger;
    
      lenSource=0;
      Hilfszeiger=strSource;
      while(*Hilfszeiger != '\0') 
        Hilfszeiger++;
    //oder
      for(lenSource=0, Hilfszeiger=strSource; *Hilfszeiger;Hilfszeiger++);
    

    aNd12121 schrieb:

    if(*strSearch == *strSource)                                                         
                {...
                }
                else if(*strSource != *strSearch)  // Das if ist hier überflüssig. Was soll das denn schon anderes sein als !=
                {...
                }
    

    Du musst die '\0' noch ans Ende von strDest schreiben.

    Deine Funktion stimmt nicht mit den Vorgaben überein!



  • Diese komischen Zeiger in main brauchst du nicht!

    searchReplace(ptr1, ptr2, ptr3, ptr4);                                        //Funktion zum suchen und ersetzen aufrufen
    

    Da weiß keiner was da verändert wird. Und der Kommentar ist überflüssig.

    searchReplace(text1, zeichenkette, ersatz, text1); 
    //verglichen mit 
    int searchReplace( char *strSource, char *strSearch, char *strReplace, char *strDest )
    

    Und du siehst, dass du text1 sowohl als Quelle und als Ziel angibst.

    Arrays werden aber als Referenz übergeben. Wenn du die Arrays in der Funktion änderst, änderst du das Original.

    Wenn du also in searchReplace strDest änderst ist auch strSource geändert.
    Darum brauchst du verschiedene Arrays für Quelle und Ziel.

    Und solltest du nicht die Anzahl der Esetzungen zurückgeben?



  • aNd12121 schrieb:

    kleine Ergänzung: Wenn ich zum Beispiel bei allen 3 Texten Hallo eingebe. Kommt bei strDest nur HHHHH an.

    Dann wir Hallo durch Hallo ersetzt. Toll.

    aNd12121 schrieb:

    for(i= 0;i<laenge3;i++)
            {
                printf("%c", *strDest);
            }
    

    Du gibst ja immer das selbe Zeichen aus (das Erste).
    Wie gesagt, mach die '\0' ans Ende und nimm printf("%s", strDest);



  • ja aber das kann ich ja noch machen... erstmal muss ich es hinbekommen die zu ersetzen!

    Vielen Dank aber für die bisherige Mühe schonmal. Die Namen hab ich nun schonmal verändert.



  • Wie gesagt, mach die '\0' ans Ende

    das verstehe ich noch nicht genau, wo genau ich das hinsetzen muss. Der Rest ist mir bisher klar!:)



  • So schaut es jetzt aus. Bei einem Wort kann ich jetzt shcon eine Zeichenkette ersetzen. Wenns länger geht hapert es aber leider noch.
    Tut mir echt leid, magst du mir vllt nocheinmal helfen?

    for(i=0; i <lenSource; i++)															// Funktion zum ersetzen
    		{
    			if(i==stellarr[k])
    			{
    				x=0;
    				while(x!=lenReplace)
    				{
    					*(strDest+i) = *(strReplace+x);
    					x++;
    					i++;
    				}
    				k++;
    			}
    			else if(i != stellarr[k])
    			{
    				*(strDest+i) = *(strSource+(k*lenSearch+z));
    				z++;
    			}
    		}
    
    		printf("\n\nDer ueberarbeitete Text sieht wie folgt aus:\n\n");
    
    		printf("%s", strDest);
    


  • In C wird ein String als eine Reihe von Zeichen angesehen, die am Ende ein '\0' haben.

    Aus
    char hello[] = "Hallo" ; wird
    `char hello[6];

    hello[0] = 'H';

    hello[1] = 'a';

    hello[2] = 'l';

    hello[3] = 'l';

    hello[4] = 'o';

    hello[5] = '\0';`

    ⚠ Die Stringlänge ist 5, aber der Platzbedarf für den String ist 6 char.

    '\0' ist das Zeichen mit dem Wert 0.

    Alle Stringfunktionen aus Standard-C-Library erwarten einen Nullterminierten String.
    fgets hängt die '\0' automatisch dran.



  • while(*strSource != '\0')                                                        //siehe Zeichenkette
        {
            strSource = strSource+1;                                                           
    
            if(*strSource != '\0')
            {
    
                laenge3 = laenge3 + 1;                                                       
            }
        }
    

    Das kann man noch kürzer schreiben, viel wichtiger ist aber, es in eine Funktion zu stecken.
    Vorschlag:

    int mystrlen(const char* str)
    {
        int length = 0;
    
        while(*str++ != '\0') // auch möglich und kürzer wäre: while(*str++)
            ++length;
    
        return length;
    }
    

    Lagere Dinge, die du öfters brauchst, in Funktionen aus.



  • Ich steig da nicht so ganz durch, wozu ist stellarr[] da?
    Arrays fangen bei 0 an. (Bei dir wird k mit 1 initialisiert.)

    Wo ist jetzt das if ( *source == *search) //Sinngemess bzw. was machst du wenn der strSearch nur teilweise gefunden wird?

    Geh das Ganz doch mal auf dem Zettel durch. Mit den Fingern auf die aktuelle Position des Vergleichs. Und schau mal wie viele Finger du brauchst.



  • So schaut es mittlerweile aus. Wenn die Zeichenkette und die zu ersetzende Zeichenkette gleich sind, funktioniert es. Sobald aber unterschiede auftreten in der länge funktioniert es überhaupt nicht mehr... leider kann ich mir das aber nicht erklären. Vielleicht findet ja jemand den/die Fehler die ich übersehe. Aufjedenfalll schonmal vielen danl für die hilfreichen Tipps. Das Programm ist aufjedenfall schon kürzer und übersichtlicher gewurden und zu teieln funktioniert es ja auch schon:)

    k=0;
    
    		for(i=0; i <lenSource; i++)															// Funktion zum ersetzen
    		{
    			if(z==stellarr[k])														//stellarr[k] sind die stellen an denen die Zeichenkette ersetzt werden soll
    			{
    				x=0;
    				while(x!=lenReplace)
    				{
    					*(strDest+i) = *(strReplace+x);
    					x++;
    					i++;
    				}
    				k++;
    				z = k *lenSearch+z+1;
    			}
    			else if(z != stellarr[k])
    			{
    				*(strDest+i) = *(strSource+z);
    				z++;
    			}
    		}
    


  • kann mir keiner mehr helfen?

    mit freundlichen Grüßen



  • Bei sowas wie z = k *lenSearch+z+1; weiss doch keiner was das bedeuten soll.
    Du musst dir die Stelle (j) merken ab der du strSearch in strSource vergleichst.
    Wenn du strSearch gefunden hast, kopierst du ab der Stelle (j) strReplace nach strDest.
    Wenn du strSearch nicht gefunden hast, kopierst du ab der Stelle (j) (bis zum Unterschied) strSource nach strDest.

    Dann suchst du ab der Stelle weiter, wo der Unterschied / String gefunden eingetreten ist.

    Bitte mit aussagekräftigen Variablennamen.


Anmelden zum Antworten