Pointer und Char.
-
Es geht. letztendlich weiß ich ja wie ich die Zeichenkette im Text finden kann. (Also erstes Zeichen suchen und dann solange vergleichen bis die Zeichenkette zuende ist, dafür hab ich ja auch die länge ermittelt, damit der compiler sozusagen weiß wie lange er vergleichen muss) aber wie ich es dann hinbekomme, den Text zu ersetzen, dass weiß ich leider nicht!?
-
Du sollst doch mit Zeigern arbeiten, außerdem fehlt bei dir stimt die Funktionssignatur nicht mit der aus der Aufgabenstellung überein.
Probier doch mal folgendes: Schreib dir eine Hilfsfunktion
find
, die zwei const chars entgegennimmt (in deinem Bsp. strSource und strReplace) und bei Auffinden des Teilstrings einen Zeiger auf das erste Zeichen zurückliefert (sonst 0).
Splitte das Problem in kleinere Teilaufgaben.Und bei der Entwicklung kannst du zum Testen auch erst einmal hardcodierte Strings nehmen, um diese nicht bei jedem Testlauf eingeben zu müssen.
Und lerne den Debugger kennen!
Versuche erst mal selber grob eine Lösung zu finden, diese Übungsaufgabe ist nämlich wirklich sinnvoll (im Gegensatz zu vielen anderen, die hier gepostet werden).
-
Ich hab jetzt noch folgenden Teil in der Funktion hinzugefügt:
for(int i = 0; i <100; i++)
{
if(*strSearch == *strSource)
{
strSearch++;
j++;
}
else if(*strSource != *strSearch)
{
strSearch = strSearch - j;
j = 0;
}
if(j==(laenge))
{
stellen = i - laenge + 1;
printf("%d ", stellen);
strSearch = strSearch - j;
j = 0;
anzahl++;
}
strSource++;}
Damit ermittelt er nun wie oft und an welchen Stellen die Zeichenkette ist. Leider ist weiterhin mein Problem wie ich nun die Zeichenkette ersetzen kann...
-
Bei dem Funktionsprototyp von searchReplace aus der Aufgabe gibt es doch ein strDest in der Parameterliste. (Der fehlt bei dir)
Da kopierst du die Zeichen aus strSource rein die nicht übereinstimmen und strReplace wenn sie übereinstimmen.Benutze doch bitte die cpp-Tags. Code markieren und den C/C++ Button unter den
anklicken und schon wird dein Code farbig und bunt
int searchReplace( char *strSource, char *strDest, char *strSearch, char *strReplace );
-
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 nimmprintf("%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.