Abfrage ob Buchstabeneingabe



  • moin nochmal,

    Es gibt ja die möglichkeit mit isdigit abzufragen ob es einen Zahl ist.

    Nun Frage ich mich ob es auch einen Befehl gibt der Buchstaben überprüft.

    gibet sowat?

    :xmas1: :xmas1:



  • Virokams schrieb:

    moin nochmal,

    Es gibt ja die möglichkeit mit isdigit abzufragen ob es einen Zahl ist.

    Nun Frage ich mich ob es auch einen Befehl gibt der Buchstaben überprüft.

    gibet sowat?

    :xmas1: :xmas1:

    Es gibt noch mehr als isdigit() ... z.B. isalpha()...

    Gruß,

    Simon2.



  • whow... sehr gut Dankesehr 🙂



  • Gern geschehen! :xmas1:


  • Administrator

    @Simon2,
    Schäm dich! Die C Lösung zu präsentieren, also wirklich, schäm dich 😃
    Ja, es gibt hierfür eine C++ Lösung, nur ist mir schon oft aufgefallen, dass sie den Leuten nicht so geläufig ist. Das Problem ist nämlich, dass bei deiner vorgeschlagenen Lösung, das C Locale verwendet wird, was zu Problemen führen kann.

    Korrekt wäre das hier:

    #include <locale>
    
    int main()
    {
      std::isalpha('c', std::locale());
      // Verwendet das aktuelle C++ Locale.
      // Man könnte aber auch etwas anderes übergeben.
    
      return 0;
    }
    

    http://www.dinkumware.com/manuals/?manual=compleat&page=locale2.html#isalpha

    Grüssli



  • while (isdigit(term[0]) )
    		{    bla bla... }
    

    thats now that what Im using...

    and also I would use

    [cpp]while(isalpha(term[an position keineahnugnwas]) )

    ne also.. wozu den std:isalpha dings nutzen wenns auch anders geht 😃 bzw komplizierter für die meisten hier im Forum sind meine Lösungswege eh vom anderen Planeten XD

    gruß

    Ps: Die Links sind aber super hilfreich 🙂 Danke



  • Eine Frage noch:

    muss wenn ich isalpha() nutze das was in der () steht einen bestimmten Wert haben?

    Ich versuche das so zu nutzen das ein const char * in der () steht funktioniert das?

    ich hab nemlich momentan einige heftige Abstürze wenn ich das nutze 🙂


  • Administrator

    Virokams schrieb:

    ne also.. wozu den std:isalpha dings nutzen wenns auch anders geht ...

    Weil die C Funktion unter Umständen falsche Ergebnisse liefert. Aber wenn du dir natürlich fehleranfällige Methoden angewöhnen willst, dann ist das dein Bier 😉

    An das isalpha in C muss man ein int übergeben, also ein einzelnes Zeichen. Das sieht man auch wunderbar in der Dokumentation.

    An das std::isalpha in C++ muss man nicht unbedingt ein int übergeben, aber es muss ein einzelnes Zeichen darstellen. Kann also grundsätzlich jeglicher integrale Datentyp sein.

    An beide Funktionen kannst du aber ganz sicher keinen Zeiger übergeben.

    Als C++ Referenz empfehle ich übrigens eher diese hier:
    http://www.cplusplus.com/reference/

    Grüssli



  • aber theorätisch müsste dann doch isalpha(arraybla[position i]) doch ohne Probleme laufen oder?

    wo arraybla vorher als const char * arraybla deklariert war...

    Ach ich Kopier hier mal meine Zeilen hin :

    //Buchstabe
    	for(i=0; term[i] != '\0'; i++)
    	{
    		if (isalpha(term[i]))
    		{
    			my_strcpy(temp3, term);	//Aufruf von strcpy
    			return berechne(temp3);
    		}
    	}
    

    my_strcpy :

    // strcopy ( dest, source )
    char * my_strcpy(char* dest, const char * source)
    {
    int j = 0;
    for (int i = 0; source[i] != '\0' ;i++)
    {
    	if(source[i] != ' ')
    	{
    		dest[j++] = source[i];
    	}
    	else if(isalpha(source[i]))
    	{
    		dest[j++] = source[i];
    	}
    }
    dest[j] = '\0';
    return dest;
    }
    

  • Administrator

    Was für Abstürze hast du denn und wo treten sie auf? Wieso können die Leute, den Fehler nie beschreiben? ... *Hoffnungsloser seufzer* ... 🙂

    Desweitern, dir ist schon klar, dass in deiner my_strcpy Funktion, die zweite If-Abfrage gar nie erreicht wird. Jeglicher Buchstabe ist ungleich einem Leerschlag 😉

    Grüssli



  • btw:
    warum eigtl (const) char* und kein std::string?
    und warum my_strcpy und kein <algorithm> - zeugs?

    und irgendwie ergibt für mich das (erste) stück code keinen sinn...
    erklär ma pls, was du da wirklich machen willst...

    bb



  • SO also Fehler tauch auf wenn ich Buchstaben eintippe also zb

    sjkdfsf222+skjhfbdjhvbdfhbgsj333 oder so

    Stack overflow...

    aber wenn du schon sagst das der my_strcpy else if : ... eh falsch ist wird es wohl auch daran liegen weil er da wie du sagst Leeraufruf ist immer ungleich Buchstabe oder was du meintest 😕 :xmas1: ⚠

    Codeerklärung:

    Wenn nun ein Buchstabe irgendwo steht soll sozusagen der Buchstabe weggemacht werden und dann der restliche Term an diese Stelle verschoben werden.

    Ich habe mit der selben Vorgehensweise auch das Problem der Leerzeichen gelöst. (2 + 2) sozusagen wird dann zu 2+ 2 und dann 2+2..

    //Leerzeichen 
    	for(i=0; term[i] != '\0'; i++)
    	{
    		if (term[i] == ' ')
    		{
    			my_strcpy(temp2, term);	//Aufruf von strcpy
    			return berechne(temp2);
    		}
    	}
    


  • na dann nimm std::remove_if

    macht genau das gleiche wie dein my_strcpy...

    mal davon abgesehen, dass ich glaube, dass du das ganze falsch angehst... du solltest einen "richtigen" parser schreiben/nehmen - und der sollte leerzeichen einfach ignorieren und klammern einfach richtig beachten - dann ist es auch egal, ob da (2+2) oder 2+2 oder (2 + 2) oder was auch immer steht...
    dieses kleine stück könntest du zwar jetzt auch mit deinem stück code lösen, aber dann suchst du vll eher nen substring und nicht den kompletten kopierten string?

    //Leerzeichen 
        for(i=0; term[i] != '\0'; i++) //wo ist i eigtl deklariert? eigtl macht man das immer in der schleife an sich
        {
            if (term[i] == ' ')
            {
                my_strcpy(temp2, term);    //wenn ich jetzt alles richtig verstanden habe, sollte da ein &term[i] stehen...
                return berechne(temp2); //soll vrmtl eine rekursion darstellen? oder ist es das endgültige berechnen des stückchens, was du da jetzt geparst hast?
            }
        }
    

    bb

    PS: So ne Fehler findet man idR immer mit nem Debugger - manchmal relativ schnell und manchmal dauert es doch ein wenig länger (aber wenns ma wieder länger dauert... dafür gibts ja so nen schokoriegel ^^)- und da du iwann sicherlich mal auf ihn angewiesen sein wirst, solltest du es auch schon bei so relativ überschauberen aufgaben versuchen - sonst sitzt du später ewig...



  • Dravere schrieb:

    @Simon2,
    Schäm dich! Die C Lösung zu präsentieren, also wirklich, schäm dich :D...

    😞 😞 😞 *shame on me!*

    ... allerdings hatte ich es eilig und in der cppreference war das Andere einfach schneller zu finden. 😉

    Gruß,

    Simon2.


Anmelden zum Antworten