Probleme mit C++ und Zeigern

Kutshi

Grünschnabel
Hallo,

Ich soll in C++ einen String nach einem kleineren String druchsuchen. Hierbei soll ich nciht die std::string Klasse verwenden. Mein Quellcode sieht bis jetzt wie folgt aus:

Code:
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    //Zur Ueberpruefung ob ein Streing gefunden wurde.
    bool wait = true;
    //Ernthaelt die Stelle des ersten gefundenen Strings.
    int place; 
    //Die beiden Strings die eingelesen werden, hierbei ist str der zu durchsuch-
    //ende und find der in str zu findene STring.
    string str, find;
    //Die einzelnen Buchstaben von str(p1) und find(p2) zum vergelichen dieser.,
    char *p1, *p2;
    
    
    //Die beiden Strings werden eingegeben.
    cout << "suche "; 
    cin >> str;
    cin >> find;
    
    
    //While Schleife die str druchgeht und mit den einzelnen Buchstaben von dem
    //zu findenen String überprüft. Hierbei wird zurerst der erste Buchstabe 
    //gesucht und wenn dieser gefunden wurde wird überprüft ob diesem der zweite
    //folgt, und so weiter.
    while(*p1 != '\0'){
            for(place = 0 ; *p2 != '\0' ; place++, *p2++){
                  if(*p1 == *p2){
                       wait = false;
                       cout << "Antwort: " << place << endl;
                       break;
                       }
                       *p1++;
                  }
                  *p1++;
                  break;
          }
    
    //Wenn kein passender String gefunden wurde wird eine negative Rückmeldung 
    //gegeben.
    if(wait){
             cout << "Der String ist nicht gefunden worden." << endl;
             }
}

Hierbei fehlt jetzt natürlich noch die Zeiger zuweisung von dem String zum Char. Jetzt hab ich aber folgende Fragen:

1.) Kann mein Zeiger überhaput vom tpy char sein wenn meine Variable ein String ist?
2.) Wie bekomme ich es jetzt bin das der Zeiger zuanfang auf den ersten Buchstaben zeigt?

Habe schon versucht verschiedne Lösungen aus dem Internet anzuwenden da ich aber in C++ noch ein blutiger Änfänger bin und Zeiger erst seit eineinhalb Wochen kenne hat mir das nicht gerade viel weitergeholfen.

Ich hoffe ihr habt einen kleinen Tipp für mich, wie ich endlich zum ZIel komme.

LG
 
Hi und Willkommen bei tutorials.de :)

Wenn du die string-Klasse nicht verwenden darfst, warum machst du es dann (str und find)?

Strings kannst du genau so gut als char-Array sehen, also einfach mehrere Buchstaben/Zeichen.
Und die Pointer p1 und p2 können dann natürlich auch char* sein.
Aber da du auf char-Arrays wie auf jedes andere Array mit [...] zugreifen kannst, brauchst du p1 und p2 eigentlich gar nicht.

Die Länge eines char-Array-Strings bekommt man mit der Funktion strlen

Angenommen, der Eingabestring hat eine Länge von 24, und er Suchstring 4, dann gehst du in einer for-Schleife von 0 bis <20 durch und gehst in der Schleife zu jedem Buchstaben nocheinmal in einer Schleife alle Suchstring-Buchstaben durch, ob sie mit dem akuellen und den folgenden zusammenpassen.

Bei deiner aktuellen Suchmethode hast du das betreffend einen Fehler: Du nimmst auch 21, 22, 23 dazu und gehst damit über das Stringende hinaus. Außerdem erhöhst du in der innerer Schleife p1 und bringst so die äußere durcheinander.

Gruß
 
Hey,

Hab mich heute nochmal an die Aufgabe getraut und hab nur ne ganz kleine Frage:

Ich will ja die Eingabe von Nutzer bekommen, weiß aber nicht wie lang die sein wird.
WIe muss ich das char-Array nun definieren das ich ne Eingabe machen kann, welche kein Stirng ist und troztdem funktioniert für die Eingabe? Kann ich das also unbegrenzt erzeugen oder muss ich sozusagen ein möglich großes erzeugen also indem ich ihm die länge 100 z.b. mitgebe?

Lg und danke nochmal für die schnelle hilfreiche Antwort :)
 
Zuletzt bearbeitet:
Hi

ja, es muss eine Maximallänge vorhanden sein.
Zumindest bei so einer Schreibweise:
C++:
char xyz[123];
Es gibt noch eine kompliziertere Möglichkeit, bei der es zwar auch eine Maximallänge gibt, die du aber während der Laufzeit anpassen kannst.
Allerdings nicht mitten in der Eingabe (die ja normalerweise von fertigen Funktionen wie fgets, scanf oder cin etc übernommen wird).
Du musst also in beiden Fällen vor Beginn einer Eingabe eine Maximallänge haben.
Beim ersten Fall immer fix, im zweiten Fall dynamisch festlegbar.

Die String-Klasse in Wirklichkeit auch nur ein char-Array, das durch die Klasse rundherum ein paar Zusatzfunktionen bekommt.
Wendet intern auch Möglichkeit 2 an, allerdings sieht man das beim Verwenden nicht.

Die dritte, "beste" Möglichkeit: Während der Benutzereingabe das Array vergrößern, falls es nicht groß genug ist.
Dafür musst du aber eine Eingabefunktion wie scanf/cin/... selber programmieren, da die fertigen das nicht machen.

Sind damit alle Klarheiten beseitigt? :D

Gruß

PS: Du kannst dienen neuen Versuch auch ruhig reinstellen, wir beißen nicht :)
Dann kann man den auch gleich kontrollieren und Verbesserungsvorschläge geben.
 
Zuletzt bearbeitet:
PS: Du kannst dienen neuen Versuch auch ruhig reinstellen, wir beißen nicht :)
Dann kann man den auch gleich kontrollieren und Verbesserungsvorschläge geben.

Da Gestern Abend Abgabe war, stelle ich jetzt mal den Quelltext rein, der es nachher geworden ist. Hab mich dafür entschieden, das ganze Vorzudefiniren, ob es jetzt groß genug ist weiß ich nicht hoffe es aber.
Code:
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    bool wait = true;
    int place; 
    char str[500], find[500];
    
    cout << "suche "; 
    cin >> str;
    cin >> find;
    
    int strlength = 500, findlength = 500;
   
    for(place = 0; place <= strlength; place++){
              
            if(find[0] == str[place]){
                 
                 for (int j = 0; find[j] != '\0'; j++) {
                        if (find[j] == str[place + j]) {
                        wait = false;
                     } else {
                        
                        wait = true;
                        break;
                     }
                 }
            }
            
            if (!wait) {
               break;
            }
    }
    
    if(wait){
           cout << "Der String ist nicht gefunden worden." << endl;
    } else {
           cout << "Antwort: " << place << endl;
    }
    
}

Ganz ohne Pointer :). Ich glaub ich hatte mich da in eine fixe Idee verannt.
 
Zuletzt bearbeitet:
Zurück