Leerzeichen



  • Was ist der Code für ein Leerzeichen?
    Zum Beispiel für ein Zeilenumbruch wäre es ja "\n".
    Und für eun Leerzeichen 😕 😕



  • Skeptar schrieb:

    Was ist der Code für ein Leerzeichen?
    Zum Beispiel für ein Zeilenumbruch wäre es ja "\n".
    Und für eun Leerzeichen 😕 😕

    ' ' als Zeichen oder " " als Stringliteral.
    Kannst du per C&P übernehmen.

    ^Versuch mal die breite Taste in der untersten Zeile deiner Tastatur.^



  • Okay danke aber habe immer noch nicht das gewünschte Ergebnis.
    Hier mein Code:

    char *zeiger=chat;
        cout << *zeiger;
        do{
        if(*zeiger++ == ' '){
            if(*zeiger++ == 'O'){
                if(*zeiger++ == 'k'){
                    cout << "Ungueltig";
                }
            }
        }
        }while(*zeiger!='\0');
    

    Wenn ich jedzt schreibe

    Ok
    

    und den Zeiger an erster Stelle ausgeben gibt er mir als Ausgabe ein "O" warum werden die Leerzeichen übersprungen und wie kann ich das verhindern?


  • Mod

    Wie liest du den String ein? Über std::getline ? Oder mit operator>> ?



  • Arcoth schrieb:

    Wie liest du den String ein? Über std::getline ? Oder mit operator>> ?

    Ups 😃

    char chat[1000];
        cin >> chat;
    

    Da ist der Rest.
    Und getline() geht nicht.


  • Mod

    Und getline() geht nicht.

    Doch, es gibt auch für C-Strings ein getline :

    cin.getline( chat, 1000 ); // Optional mit Delimiter
    


  • SUper danke! 😃



  • Es funktionert wieder etwas nicht...

    Wenn ich nun eingeben

    Das Haus ist rot und die Treppe ist blau Wort
    

    sagt er mir das kein unerlaubtes Wort gefunden wurde obwohl "Wort" das unerlaubte Wort ist.
    Wenn ich aber jedzt

    asd Wort
    

    eingebe klappt es wunderbar.

    Hier mein Code ich bin noch nicht fertig aber ich brauche das um ihn fertig zu bekommen 🙂

    #include <iostream>
    #include <cstring>
    #include <conio.h>
    using namespace std;
    
    int main(){
        char chat[1000], boseswort[] = "Wort";
        cin.getline(chat, 1000);
        char *zeiger_chat=chat, *zeiger_boseswort=boseswort;
        bool gefunden=false;
        for(unsigned int i=0;i<strlen(chat);i++){
    
            if(*zeiger_chat++ == ' '){ //Wenn vor dem Wort ein Leerzeichen -> Schleife
                for(unsigned int i=1;i<=strlen(boseswort);i++){
                    if(*zeiger_chat ++ == *zeiger_boseswort++){
                        if(gefunden != true){
                            gefunden=true;
                        }
                        else{
                            //Falls gefunden schon True ist
                        }
                    }
                    else{
                        gefunden=false;//Falls das Wort nur halb übereinstimmt setz gefunden auf false
                    }
                }
            }
    
        }
        if(gefunden==true){
            cout << "Es wurde ein unerlaubtes Wort gefunden.";
        }
        else{
            cout << "Es wurde nichts gefunden";
        }
    
    }
    

    Info: Er geht nur in die Schleife wenn vor dem Wort ein Leerzeichen ist



  • Du musst deine gefunden Variable, vor Eintritt in die Schleife, die deinen String für boseswort durch geht auf true setzen und in der Schleife dann auf false setzen, falls ein char aus der chat-Array nicht mit dem char aus dem boseswort-Array übereinstimmt. Wenn gefunden nach Beendigung der Schleife noch immer true ist, kannst du deine erste Schleife abbrechen.



  • Mr.Long schrieb:

    Du musst deine gefunden Variable, vor Eintritt in die Schleife, die deinen String für boseswort durch geht auf true setzen und in der Schleife dann auf false setzen, falls ein char aus der chat-Array nicht mit dem char aus dem boseswort-Array übereinstimmt. Wenn gefunden nach Beendigung der Schleife noch immer true ist, kannst du deine erste Schleife abbrechen.

    Kann dir nicht ganz folgen 😕

    #include <iostream>
    #include <cstring>
    #include <conio.h>
    using namespace std;
    
    int main(){
        char chat[1000], boseswort[] = "Wort";
        cin.getline(chat, 1000);
        char *zeiger_chat=chat, *zeiger_boseswort=boseswort;
        bool gefunden=true; // Auf true gesetzt <--------------------
        for(unsigned int i=0;i<strlen(chat);i++){
    
            if(*zeiger_chat++ == ' '){ //Wenn vor dem Wort ein Leerzeichen -> Schleife
                for(unsigned int i=1;i<=strlen(boseswort);i++){
                gefunden=false; // Auf false gesetzt <--------------------
                    if(*zeiger_chat ++ == *zeiger_boseswort++){
                        if(gefunden != true){
                            gefunden=true;
                        }
                        else{
                            //Falls gefunden schon True ist
                        }
                    }
                    else{
                        gefunden=false;//Falls das Wort nur halb übereinstimmt setz gefunden auf false
                    }
                }
            }
    
        }
    
        if(gefunden==true){
            cout << "Es wurde ein unerlaubtes Wort gefunden.";
        }
        else{
            cout << "Es wurde nichts gefunden";
        }
    
    }
    

    Ich denke das ist falsch und es geht immer nocht nicht..
    Bitte nochmal etwas leichter erklären :s

    Edit: Kann mir keiner Helfen? 😕



  • Lass dir mal in der boseswort-Schleife die Werte von boseswort und zeiger_boseswort ausgeben.
    Also die Zeigerwerte (ohne * und &)

    Oder mit dem Debugger.

    Egal.

    Du setzt zeiger_boseswort nie wieder auf boseswort

    Statt for(unsigned int i=0;i<strlen(chat);i++){ machst du ganz einfach *while (zeiger_chat){



  • DirkB schrieb:

    Lass dir mal in der boseswort-Schleife die Werte von boseswort und zeiger_boseswort ausgeben.
    Also die Zeigerwerte (ohne * und &)

    Oder mit dem Debugger.

    So habe ich.
    Irgendwie kommt da wirres Zeug raus womit ich nichts anfangen kann 😕 😕

    Ich hoffe ich nerve nicht allzu sehr.



  • DirkB schrieb:

    Du setzt zeiger_boseswort nie wieder auf boseswort

    Also vergleichst du nie wieder ab dem Anfang von boseswort.
    Wenn du boseswort nicht gefunden hast, musst du beim nächsten Vergleich wieder am Anfang von boseswort anfangen.

    Ich denke auch, du bekommst Probleme, wenn das letzte Wort im Text weniger Buchstaben hat als dein boseswort.
    Dann läufst du über die Stringgrenzen hinaus.
    Du musst die innere Schleife beenden, wenn ein Vergleich nicht passt.

    Auch dass du mehrmals in der Schleife *zeiger_chat++ machst, gibt Probleme.



  • Okay nun habe ich es verstanden!
    Ich habe das nun eingesetzt und jedzt verstehe ich auch was du mit der Aussage meinst

    Lass dir mal in der boseswort-Schleife die Werte von boseswort und zeiger_boseswort ausgeben.

    Und da steht nun bei zeiger_boseswort immer das gleiche wie in boseswort 😃
    Dennoch wenn ich nun

    Peter ist cool und mag das Wort
    

    eingebe sagt er wieder nichts gefunden 😕

    else{
    gefunden=false;//Falls das Wort nur halb übereinstimmt setz gefunden auf false
    zeiger_boseswort=boseswort;//Das habe ich neu reingemacht
    }
    

    Ich hoffe du kannst den Codeschnipsel zuordnen 🙂

    Auch dass du mehrmals in der Schleife *zeiger_chat++ machst, gibt Probleme.

    Aber das ist doch richtig so, weil ich möchte das die 1000 Zeichen nur einmal durchlaufen werden oder nicht 😕



  • Peter ist cool und mag das Wort
    

    Das sind 31 Zeichen mit 6 Leerzeichen.

    Wenn Peter das boseswort ist, wird es nicht gefunden, da es nicht mit einem Leerzeichen anfängt.

    Bei jedem Leerzeichen wird zeiger_chat um strlen(boseswort) weiter gesetzt.
    zeiger_chat wird also 31 + 6*4 = 55 Zeichen weiter gesetzt. Da ist dein String aber schon lange zuende.

    Du vergleichst immer alle Zeichen von boseswort .
    Selbst wenn nach dem ersten Zeichen klar ist, dass es nicht übereinstimmen kann.

    Zwischendurch wird dann wohl auch mal gefunden wieder auf false gesetzt.
    Du musst Abbrechen, wenn du das Wort gefunden hast.

    Warum nimmst du nicht strstr



  • Ähm ja. 😃

    Das sind 31 Zeichen mit 6 Leerzeichen.

    Das ist klar.

    Wenn Peter das boseswort ist, wird es nicht gefunden, da es nicht mit einem Leerzeichen anfängt.

    Das wieder nicht, weil das boseswort ist "Wort" nicht "Peter". (War zu undeutlich von mir)

    Bei jedem Leerzeichen wird zeiger_chat um strlen(boseswort) weiter gesetzt.
    zeiger_chat wird also 31 + 6*4 = 55 Zeichen weiter gesetzt. Da ist dein String aber schon lange zuende.

    Woher hast du die mal 4 😕

    Du vergleichst immer alle Zeichen von boseswort .
    Selbst wenn nach dem ersten Zeichen klar ist, dass es nicht übereinstimmen kann.

    Zwischendurch wird dann wohl auch mal gefunden wieder auf false gesetzt.
    Du musst Abbrechen, wenn du das Wort gefunden hast.

    Ja.

    Warum nimmst du nicht strstr

    Habe jedzt damit angefangen (habe davor noch nie etwas davon gehört oder gelsen) und möchte das gerne einmal so zuende bringen danach könnte ich die andere Methode ja mal ausprobieren.



  • Skeptar schrieb:

    Wenn Peter das boseswort ist, wird es nicht gefunden, da es nicht mit einem Leerzeichen anfängt.

    Das wieder nicht, weil das boseswort ist "Wort" nicht "Peter". (War zu undeutlich von mir)

    Das ist mir klar. Dann ändere den Satz in "Wort das mag und coll ist Peter".
    Ich wollte damit zum Ausdruck bringen, dass du boseswort nicht am Anfang findest.

    Skeptar schrieb:

    Bei jedem Leerzeichen wird zeiger_chat um strlen(boseswort) weiter gesetzt.
    zeiger_chat wird also 31 + 6*4 = 55 Zeichen weiter gesetzt. Da ist dein String aber schon lange zuende.

    Woher hast du die mal 4 😕

    Steht doch da: strlen(boseswort) . boseswort ist bei dir "Wort". Das sind 4 Zeichen.
    Bei jedem Leerzeichen läuft deine for(unsigned int i=1;i<=strlen(boseswort);i++){-Schleife.

    Skeptar schrieb:

    Warum nimmst du nicht strstr

    ...(habe davor noch nie etwas davon gehört oder gelsen)...

    Da du in C mit cout programmierst, solltest du dir zumindest mal die Funktionen der C-Standardlibrary ansehen.
    Und wenn du C++ machen willst, auch die Klassen von C++



  • Steht doch da: strlen(boseswort) . boseswort ist bei dir "Wort". Das sind 4 Zeichen.
    Bei jedem Leerzeichen läuft deine for(unsigned int i=1;i<=strlen(boseswort);i++){-Schleife.

    Wieder um ein Stückchen schlauer 😃

    Da du in C mit cout programmierst, solltest du dir zumindest mal die Funktionen der C-Standardlibrary ansehen.
    Und wenn du C++ machen willst, auch die Klassen von C++

    Stimmt. Kommt noch^^

    So jedzt klappt es eig. mein Code ist hier:

    #include <iostream>
    #include <cstring>
    #include <conio.h>
    using namespace std;
    
    int main(){
        char chat[1000], boseswort[] = "Wort";
        cin.getline(chat, 1000);
        char *zeiger_chat=chat, *zeiger_boseswort=boseswort;
        bool gefunden=false;
        int f=0,g=strlen(chat);//<------------------- Die beiden Variablen f & g
        while (*zeiger_chat){
                if(*zeiger_chat++ == ' ' && *zeiger_chat == *zeiger_boseswort){ //Gehe nur in die Schleife wenn vor dem Wort ein Leerzeichen ist
                //und der erste Buchstabe hinter dem Leerzeichen mit dem ersten Buchstaben vom bosenwort übereinstimmt
    
                        for(unsigned int i=1;i<=strlen(boseswort);i++){
    
                            if(*zeiger_chat ++ == *zeiger_boseswort++){
                                if(gefunden != true){
                                    gefunden=true;
                                }
                                else{
                                    //Falls gefunden schon True ist
                                }
                            }
                            else{
                                gefunden=false;//Falls das Wort nur halb übereinstimmt setz gefunden auf false
                                zeiger_boseswort=boseswort;
                            }
                        }
    
                }
                else{
                //Bedingung nicht erfüllt -> keine Schleife
                }
    
        }
    
        if(gefunden==true){
            cout << "Es wurde ein unerlaubtes Wort gefunden.";
        }
        else if(gefunden==false){
            cout << "Es wurde nichts gefunden";
        }
        else{
            cout << "Fehler bei der 'gefunden' ausgabe";
        }
        cout << f << ".." << g; //<------------------- Ausgabe der While Schleifen durchläufe (f) und die tatsächliche Stringgröße (g).
    //<------------------- Beide sind identisch wenn er nicht in die boseswort Schleife geht
    //<------------------- Wenn er in die boseswort Schleife geht ist f=f-(die Anzahl der Buchstaben in der Variable boseswort)
    return 0;
    }
    

    Also klappt so. Ich kann halt nicht jeden Text ausprobieren also bitte nochmal drüber gucken ob das soweit stimmt.


Anmelden zum Antworten