hab mir gez ne tolle eingabefunktion gebastelt.... nur ein problehm...



  • Was willst du machen?

    Es kann dir wohl niemand helfen, wenn du nicht sagst, was nicht geht? Gibt es falsche Ausgaben, nicht die gewünschte? Mach ein Minimalbeispiel das den Fehler zeigt und poste es, halt ohne die Schleifengeschichten.

    Vom Funktionsnamen liesse sich deuten, dass du nur ne Zahl einlesen willst:
    Da hab ich hier im Forum folgendes gefunden:

    using namespace std;
    
    template< typename return_t>
    return_t read_from_cin( string const & prompt )
    {
        string input;
        stringstream sstr;
        return_t ret;
        do
        {
            sstr.clear();
            cout << prompt << flush;
            getline( cin, input );
            sstr.str( input );
            sstr >> ret;
        } while( !sstr );
        return ret;
    }
    //...
    int n = read_from_cin<int>( "Bitte Zahl eingeben: " );
    


  • also iss scho mal ne sehr gute antwort... ich schick dir mal echt meine scheiss funktion m. allen anderen die ich brauchte.... vlt vestehst mir ja dann *g* aber kann n bissl dauern....



  • #include <iostream>
    #include <windows.h>
    #include <string.h>
    
    using namespace std;
    
    class Cursor
    {
        public:
    
        int mode(int mode)
        {
    
            CONSOLE_CURSOR_INFO cursor_info;
    
            switch(mode)
            {
                        case 2:cursor_info.bVisible = FALSE;cursor_info.dwSize = 00;break;
                        case 1:cursor_info.bVisible = TRUE;cursor_info.dwSize = 10;break;
                        case 25:cursor_info.bVisible = TRUE;cursor_info.dwSize = 25;break;
                        case 50:cursor_info.bVisible = TRUE;cursor_info.dwSize = 50;break;
                        case 75:cursor_info.bVisible = TRUE;cursor_info.dwSize = 75;break;
                        case 100:cursor_info.bVisible = TRUE;cursor_info.dwSize = 100;break;
            }
            SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
    
        }
        int get_max_y( )
        {
            HANDLE output = GetStdHandle( STD_OUTPUT_HANDLE );
            CONSOLE_SCREEN_BUFFER_INFO csbi;
            GetConsoleScreenBufferInfo( output, &csbi );
            return csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
        }
        int get_max_x( )
        {
            HANDLE output = GetStdHandle( STD_OUTPUT_HANDLE );
            CONSOLE_SCREEN_BUFFER_INFO csbi;
            GetConsoleScreenBufferInfo( output, &csbi );
            return csbi.srWindow.Right - csbi.srWindow.Left + 1;
        }
        int where_x( )
        {
            void *output = GetStdHandle( STD_OUTPUT_HANDLE );
            CONSOLE_SCREEN_BUFFER_INFO csbi;
            GetConsoleScreenBufferInfo( output, &csbi );
            return csbi.dwCursorPosition.X;
        }
        // An welcher Y Position befindet sich der Cursor
        int where_y( )
        {
            void *output = GetStdHandle( STD_OUTPUT_HANDLE );
            CONSOLE_SCREEN_BUFFER_INFO csbi;
            GetConsoleScreenBufferInfo( output, &csbi );
            return csbi.dwCursorPosition.Y;
        }
        // Gehe mit dem Cursor an pos, X , Y
        void gotoxy( int x, int y )
        {
            void *output = GetStdHandle( STD_OUTPUT_HANDLE );
            COORD pos;
            pos.X = x;
            pos.Y = y;
            SetConsoleCursorPosition( output, pos );
        }
    };
    bool formatpruefung(string eingabe)
    {
        int pruefe=0;
        int plusste=0;bool plus=false;
        int punktste=0;bool punkt=false;
        int minusste=0;bool minus=false;
        while(eingabe.compare(0,1," ",0,1)==0)eingabe.erase(0,1);
        while(eingabe.compare(eingabe.size()-1,1," ",0,1)==0)eingabe.erase(eingabe.size()-1,1);
        pruefe=eingabe.find(" ");
        if(pruefe>-1)return false;
    
        for(int i=0;i!=eingabe.size();i++)
        {
            if(eingabe[i]-48==-2){punkt=true;punktste==i;}
            if(eingabe[i]-48==-3){minus=true;minusste==i;}
            if(eingabe[i]-48==-5){plus=true;plusste==i;}
            if(eingabe[i]-48==-1)return false;      
            if(eingabe[i]-48==-4)return false;
            if(eingabe[i]-48<-5)return false;
            if(eingabe[i]-48>9)return false;       
            // ?? dürfte eigendlich nicht notwendig sein...if(eingabe[i]-48<=9 && eingabe[i]-48>-5)fehler=false;
        } 
        for(int i=punktste+1;i!=eingabe.size();i++)
        {
            if(eingabe[i]-48==-2)return false;
            if(eingabe[i]-48==-3)return false;
            if(eingabe[i]-48==-5)return false;        
        } 
        if(eingabe[0]-48==-2)return false;
        if(eingabe.size()<0)return false;
        return true; 
    
    }
    
    string strzahl_in()
    {
        Cursor cursor;
        string eingabe="";
        string ein_tmp="";
        int xpos1=cursor.where_x();
        int ypos1=cursor.where_y();
    
        do
        {
            getline(cin,eingabe);
            while(eingabe.compare(0,1," ",0,1)==0)eingabe.erase(0,1);
            while(eingabe.compare(eingabe.size()-1,1," ",0,1)==0)eingabe.erase(eingabe.size()-1,1);
            if(formatpruefung(eingabe)==true)return eingabe;
    
            cursor.gotoxy(xpos1,ypos1);
            printf("Eingabe fehlerhaft                                                              ");
            cursor.gotoxy(xpos1,ypos1);
            _sleep(2000);        
            printf("                                                                                ");
            cursor.gotoxy(xpos1,ypos1);
            cout<<eingabe<<endl;
            cursor.gotoxy(xpos1,ypos1);
    
            if(ein_tmp.size()==eingabe.size())eingabe=eingabe;
            if(ein_tmp.size()<eingabe.size())eingabe=eingabe;
            if(ein_tmp.size()>eingabe.size())
            {
                for(int i=0;i!=eingabe.size();i++)
                {
                    ein_tmp.erase(0,1);
                }
                eingabe = eingabe + ein_tmp;
            }
            ein_tmp=eingabe;
        }
        while(formatpruefung(eingabe)==false);
        while(eingabe.compare(0,1," ",0,1)==0)eingabe.erase(0,1);
        while(eingabe.compare(eingabe.size()-1,1," ",0,1)==0)eingabe.erase(eingabe.size()-1,1);    
        return eingabe;
    }
    
    Cursor cursor;
    
    int main()
    {
        while(1){
        string eingabe;
        eingabe=strzahl_in();
        cout<<eingabe<<endl;
        }
        system("pause");
    
    }
    

    jezt binn ich ma auf die antwort gespannt *g*

    MFG Baltur............



  • ach ja..... für getline bastel ich mir auch was besseres zusammen.... ( was heist besser...?) besser editierbar..... m. fgets u. getch....



  • immer noch auf antwort wart.......*G*

    mfg baltur.... und ach ja was ging und was nicht ging ist im ersten post genau beschrieben !!!! 🤡



  • Sry, aber ich blick grad nicht durch. Hab die compare() Funktion noch nie verwendet. Vielleicht jemand anders..



  • eingabe.compare(0,1," ",0,1)
    

    vergleicht den string eingabe von [i]0 bis [i]1 (string von mir ersezt durch " " [währe ja das selbe wenn man string wasweisich=" " gemacht hätte...] mit der position vom string wasweisich von [i]0 bis [i]1...... also sucht nach leerzeichen am anfang bzw am ende je nach while schleife.....

    MFG Baltur bitte hilf mir doch mal bei meiner frage *g*

    quatsch... scheisse gelabert...
    eingabe.compare(position vom string eingabe,anzahl zu vergleichender zeichen, zu vergleichenden string,position vom zu vergleichenden string, anzahl zu vergleichender zeichen) so irgendwie *g* vergleicht auf jeden fall 2 strings... erklährungsnot *G*



  • 4
    4
      5
    5
       6
    6
    w
    Eingabe fehlerhaft
                   w
       gz
    Eingabe fehlerhaft
                   gz
    

    😕
    Anstelle von return eingabe musst du dann halt der Referenz zuweisen

    void strzahl_in( string& ret)
    {
        string eingabe="";
    //...
    if( blablubb )
            {
            	ret = eingabe;
            	return;
            }
    //...
        while( blablubb );
        ret = eingabe;    
        return;
    }
    
    int main()
    {
        while(1){
        string eingabe;
        strzahl_in(eingabe);
        cout<<eingabe<<endl;
        }       
    }
    

    Aber du mischt da C und C++ durcheinander. Finde die Lösung mit return Wert besser (nur meine Meinung 🙂 )
    Ausserdem, wenn die Eingabe leer ist (nur Entertaste) dann kommt:

    terminate called after throwing an instance of 'std::out_of_range'
    what(): basic_string::compare

    Die Exception solltest du auffangen oder erst auf leere Strings prüfen.

    So ich hoff das hilft dich weiter
    mfg

    :xmas1:



  • super herzlichen dank !!!!!

    damit beantwortest du preziese meine frage und machst mich auf fehler aufmerksahm die mir net aufgefallen sind (gleich erst mal gucken *g*)

    DANKE !!!
    MFG Baltur



  • Hallo,

    void refer(std::string &given){
        given = "string.content";
    }
    

    Ist schon richtig.

    MFG winexec*


Anmelden zum Antworten