Fehler in String Programm



  • Wenn man nur zwei Werte braucht, bietet sich eigentlich immer "bool" an, das ist zudem aussagekräftiger. Versuchs doch mal so:

    bool equal = true;
    for (...) {
        if ( /*strings an der aktuellen Stelle ungleich*/ ) {
            equal = false;
            break;
        }
    }
    if ( equal )
        ....
    else
        ....
    


  • Flashgott schrieb:

    CStoll schrieb:

    Hast du mal im Debugger durchgesehen, was während der Schleife eigentlich passiert?

    Edit: Und wie kommst du überhaupt auf so merkwürdige Werte wie 6 für "gleich" und 3 für "verschieden"?

    hm du meinst sicher 5 für "gleich".
    Das sind nur 2 zufällige Werte um es zu vergleichen.
    Ist doch egal ob ich jetzt 1 2 3 oder 4 nehme?

    Ja, ich meinte 5. Und es ist zumindest ungewohnt - normal verwendet man für eine Ja/Nein-Aussage nicht zwei willkürliche Zahlenwerte, sondern einen bool (true oder false).

    Mit dem Debugger habe ich noch keine Erfahrungen.

    Dann solltest du das mal machen (btw, was für einen Compiler verwendest du eigentlich?)

    Für den Anfang kannst du auch vor der if()-Anweisung eine Ausgabe einfügen, damit du den Überblick behältst:

    cout<<vergleich<<". Vergleich: "<<*coption1<<"-"<<*coption2<<endl;
    


  • hm in Code::Blocks ist MinGW oder?
    ich habs jetzt mal so gemacht zum Testen.

    if (*coption1 == *coption2) {
             cout << *coption1 << endl;
             coption1++; coption2++;
             erg = 5;
          }
    

    Es wird nur

    H
    a
    l
    l
    o

    ausgegeben

    und wenn ich es so wie du mache

    cout<<vergleich<<". Vergleich: "<<*coption1<<"-"<<*coption2<<endl;
    

    wird nur H-H A-A L-L O-O -
    ausgegeben



  • Ich lgaube, jetzt sehe ich auch deinen Fehler - du erhöhst in jedem Schleifendurchgang deine char-Zeiger und dadurch veringert sich auch der Wert, den strlen() zurückgibt. Nach sechs Schleifedurchgängen ist vergleich=6 und coption1 zeigt auf das 'W' -> strlen(coption1) liefert 5 zurück und die Schleife wird abgebrochen.

    Wozu brauchst du überhaupt die Variable 'vergleich'? Entweder du verwendest sie als Index bei den späteren Vergleichen - oder du nutzt die String-Literale direkt, um das Ende festzustellen:

    int erg = true;
    for(int vergleich=0;vergleich!=strlen(coption1)+1&&vergleich!=strlen(coption2);++vergleich)
    {
      if(coption1[vergleich]!=coption2[vergleich])
      {
        erg=false;
        break;
      }
    }
    
    //oder
    
    int erg = true;
    for (; *coption1!='\0' && *coption2!='\0';)
    {
      if (*coption1 == *coption2)
      {
        coption1++; coption2++;
      }
      else
      {
        erg = false;
        break;
      }
    }
    


  • ok vielen dank! 🙂



  • Macht es doch - es hört erst beim \0 auf - und das ist in C-Strings die Marke "hier ist der String zu Ende".



  • ah stimmt
    Vielen dank es klappt jetzt.
    Leider habe ich noch ein Problem mit einem String programm 😞

    #include <iostream>
    #include <string>
    
    using std::cout;
    using std::endl;
    using std::cin;
    using std::string;
    
    int main()
    {
      const char *lies1 = 0;
      string string1;
      cin >> string1;
      for (int i = 0; i < string1.size(); i++) {
         *lies = string1[i];
         lies++, 
      }
      cout << "Es wurde ";
      for (int i = 0; i != strlen(lies1)+1; i++)
         cout << *lies;
      cout << "eingeben!" << endl;
      system("PAUSE");
      return 0;
    }
    

    Das programm soll statt strings cstrings verwenden,
    um etwas einzulesen und das dann auszugeben.
    Also mache ich erst cin >> in einen normalen string
    und dann tausche ich es in einen cstring um.
    Kann es aber nicht kompilieren!
    no match for operator * in lies *lies = string1[i];



  • Erstens: die Namensänderung "const char* lies1 = 0;" vs. "*lies=string1[i];" ist hoffentlich ein C&P-Fehler.

    Zweitens: In einen "const char*" darfst du nichts reinschreiben - hier brauchst du einen nicht-konstanten "char*".

    Drittens: Du hast noch keinen Speicher angefordert, wo du die String-Daten reinschreiben könntest - das dürfte dir im laufenden Programm einen SegFault entgegenwerfen.

    Viertens: Eventuell solltest du dich etwas intensiver mit Pointer-Arithmetik auseinandersetzen.

    PS: Und fünftens: Wenn es dir nicht um den Lerneffekt geht - bleib lieber bei std::string.



  • Es geht aber um den Lerneffekt 😋



  • Dann lern's gleich richtig 😉
    (übrigens können cin und cout auch direkt in char-Arrays schreiben/lesen)

    char lies[100];
    cin>>lies;
    cout<<"Sie haben "<<lies<<" eingegeben\n";
    


  • ok danke
    damit sind meine Probleme gelöst
    Frohe Weihnachten :xmas1:



  • Flashgott schrieb:

    ich muss als Übung ein Programm schreiben,...

    OK, das erklärt's ... und damit ist es halt unumgänglich (ist ja schonmal erfreulich, dass in dieser Übung auch gleich std::string vorgestellt wird).

    Flashgott schrieb:

    Aber wenn man den Wert, also "Hallo Welt"
    ändern will, muss man ja das const weglassen.

    Nein!!!
    Wenn Du "Hallo Welt" ändern möchtest, darfst Du es nicht in den konstanten Speicher legen, sondern selbst Speicher dafür bereitstellen ... z.B. über ein Array:

    char option1[100] = "Hallo Welt!"; // erzeugt ein Array von char-s und belegt den Anfang mit "Hallo Welt" (inkl. '\0'
    

    In den darfst Du dann nach Lust&Laune reinschreiben ... aber eben höchstens 100 Zeichen (inkl. abschließender '\0').

    Gruß,

    Simon2.


Anmelden zum Antworten