Pointer und Char.



  • strDest hab ich nicht im Funktionsheader weil ich nich weiß, was ich dem Pointer übergeben soll aus der Mainfunktion. Hab ihn daher seperat in der Funktion intialisiert.

    Wie genau kopiere ich die Zeichen in strDest, könntest du mir da ein Beispiel geben?

    strDest = strSource (für zum Beispiel dem ersten Element geht ja wahrscheinlich nicht oder?)



  • aNd12121 schrieb:

    strDest hab ich nicht im Funktionsheader weil ich nich weiß, was ich dem Pointer übergeben soll aus der Mainfunktion.

    Genau so wie die anderen auch.

    aNd12121 schrieb:

    Hab ihn daher seperat in der Funktion intialisiert.

    Du hast ihn definiert aber nicht initialisiert. D.h. der Zeiger zeigt irgendwo hin, aber nicht auf einen Speicherbereich, der dafür vorgesehen ist.
    Zudem verliert der Zeiger beim beenden der Funktion seine Gültigkeit.

    aNd12121 schrieb:

    Wie genau kopiere ich die Zeichen in strDest, könntest du mir da ein Beispiel geben?

    strDest = strSource (für zum Beispiel dem ersten Element geht ja wahrscheinlich nicht oder?)

    *strDest = *strSource kopiert das erste Element.
    *(strDest+1) = *(strSource+1) kopiert das zweite Element.
    *(strDest+i) = *(strSource+i) kopiert das i. Element.

    Darfst du die Funktionen aus der string.h nutzen? z.B. strlen()



  • vielen dank 🙂 hilft mir glaub ich schon ordentlich weiter 🙂 also spricht glaub ich nichts dagegen warum?



  • Eine frage hab ich nochmal. Jetzt verändere ich ja in der for schleife um die Stellen rauszufinden die Stelle auf die der Pointer zeigt. Wie mache ich das denn, dass derPointer wieder auf das erste Element zeigt?

    Vielen Dank schonmal für die bisherige Hilfe 🙂

    mit freundlichen Grüßen



  • aNd12121 schrieb:

    Eine frage hab ich nochmal. Jetzt verändere ich ja in der for schleife um die Stellen rauszufinden die Stelle auf die der Pointer zeigt. Wie mache ich das denn, dass derPointer wieder auf das erste Element zeigt?

    Wie mit einer normalen Variablen auch. Du nimmst einen Hilfszeiger und merkst dir den Wert dort oder du veränderst den Hilfszeiger.

    Und lass mal die for-Schleife weg. Die Funktion weiss nichts von den 100. Die Länge musst du selber raus finden. (Der String ist zu Ende, wenn du auf eine '\0' triffst.



  • Auch wenns echt viel ist, ich werde nochmal mein Programm hier rein kopieren. Eigentlich möchte ich nur verbesserungsvorschläge zum unteren Teil, wo als KOmmentar "zum Ersetzen" steht. Mir wird immer was falsches ausgegeben. Vielleicht findet ja jemand die Gedankenfehler. Leider verstehe ich es auch nicht nach anwenden des Debuggers.

    #include <stdio.h>
    #include <string.h>
    
    int searchReplace( char *, char *, char *, char *);
    
    int main(void)
    
    {
    	char text1[100], zeichenkette[10], ersatz[10], *ptr2 = zeichenkette, *ptr1 = text1, *ptr3 = ersatz, *ptr4 = text1;  //Texte, pointer deklarieren
    	int anzahl=0, laenge=0, j=0, stellen;
    
    	printf("Bitte geben Sie einen Text ein:  ");								//Standard Text einschreiben(max 100 Zeichen)
    	fgets(text1, 100, stdin);
    
    	printf("\n\nGeben Sie nun die zu ersetzende Zeichenkette ein:  ");			// Zeichenkette einschreiben(max 10 Zeichen)
    	fgets(zeichenkette, 10, stdin);	
    
    	printf("\n\nBitte Geben Sie die Ersatzzeichenkette ein: ");					//Ersatzzeichenkette einschreiben(max 10 Zeichen)
    	fgets(ersatz, 10, stdin);
    
    	searchReplace(ptr1, ptr2, ptr3, ptr4);										//Funktion zum suchen und ersetzen aufrufen
    
    	return 0;
    
    }
    
    int searchReplace( char *strSource, char *strSearch, char *strReplace, char *strDest )		//Funktion zum suchen un ersetzen
    
    {
    		int laenge=0, laenge2 = 0,laenge3 = 0, j= 0, stellen = 0, anzahl = 0, k = 1, stellarr[10], i, x=0, z=0;
    
    		while(*strSource != '\0')														//siehe Zeichenkette
    	{
    		strSource = strSource+1;														   
    
    		if(*strSource != '\0')
    		{
    
    			laenge3 = laenge3 + 1;														
    		}
    	} 
    
    		strSource = strSource - (laenge3+1);																			
    
    		printf("\nDer Text hat %d Zeichen.\n\n", laenge3);
    
    		while(*strSearch != '\0')														//länge der Zeichenkette ermitteln
    	{
    		strSearch = strSearch+1;														//solange hochsetzen bis '\0' kommt, da dort die  
    																						// Zeichenkette zuende ist
    		if(*strSearch != '\0')
    		{
    
    			laenge = laenge + 1;														// in der if schleife wird die Länge schließlich ermittelt
    		}
    	} 
    
    		strSearch = strSearch - (laenge+1);												// den Pointer wieder auf das erste Element zeigen lassen							
    
    		printf("\nDie Zeichenkette hat %d Zeichen.\n\n", laenge);
    
    		while(*strReplace != '\0')														// länge der Ersatzzeichenkette ermitteln(siehe Zeichenkette)
    	{
    		strReplace = strReplace+1;
    
    		if(*strReplace != '\0')
    		{
    
    			laenge2 = laenge2 + 1;
    		}
    	} 
    
    		strReplace = strReplace - (laenge2+1);
    
    		printf("Die Ersatzzeichenkette hat %d Zeichen.\n\n", laenge2);
    
    		for(i = 0; i <100; i++)															//mit der for Schleife wird ermittelt an welchen Stellen
    			{																				//die zu ersetzende Zeichenkette zu finden ist.
    
    			if(*strSearch == *strSource)													// wenn strSearch und strSource auf das gleiche Zeichen zeigen				
    			{
    				strSearch++;																//strSearch auf das zweite Element
    				j++;																		// j um 1 erhöhen.
    			}
    			else if(*strSource != *strSearch)												// wenn strSource und strSearch auf unterschiedliche Zeichen zeigen
    			{
    				strSearch = strSearch - j;													// strSearch wieder aufs erste element zeigen lassen
    				j = 0;																		// j wieder von 0 hochzählen
    			}
    			if(j==(laenge))																	// zeichenkette wurde im Text gefunden
    			{
    				stellen = i - laenge + 1;
    				stellarr[k] = stellen;														
    				k++;
    
    				strSearch = strSearch - j;													// Zeichenkette wieder aufs erste Element zeigen lassen
    				j = 0;																		// j wieder auf 0 setzen
    				anzahl++;																	// wie oft die Zeichenkette gefunden wurden ist
    			}
    			strSource++;																	// str Source nach jedem durchlauf auf das jeweils nächste
    																							// Element zeigen lassen
    		}
    
    		printf("\n\nDie Zeichenkette kommt %d mal im Text vor\n", anzahl);
    
    		strSource = strSource -100;															// strSource zeigt wieder auf das erste Element
    
    		k=1;
    
    		for(i=0; i <laenge3; i++)															// zum ersetzen
    		{
    			if(i==stellarr[k])
    			{
    				x=0;
    				while(x!=laenge2)
    				{
    					*(strDest+i) = *(strReplace+x);
    					x++;
    					i++;
    				}
    			}
    			else if(i != stellarr[k])
    			{
    				*(strDest+i) = *(strSource+(k*laenge+z));
    				z++;
    			}
    		}
    
    		printf("\n\nDer ueberarbeitete Text sieht wie folgt aus:\n\n");
    
    		for(i= 0;i<laenge3;i++)
    		{
    			printf("%c", *strDest);
    		}
    
    	return 0;
    
    }
    


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



  • 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