ß in char array einlesen... wie???



  • hallo,

    habe eine verkette liste gebastelt in der man daten zu einer person eingibt, z.b. name, anschrift, telefon etc.

    es läuft einwandfrei bis auf einen fehler bei der eingabe. und zwar wenn ich ein ß eingebe z.b. bei der straße

    void check_read_str(char input[], int j)
    {
    	int i=0,check;
    	char eingabe[42]={0};
    
    	do{
    		check=0;
    		fgets ( eingabe, j, stdin );
    		fflush(stdin);		
    		eingabe[strlen(eingabe)-1] = 0;
    		while(eingabe[i] != 0){
    			if ( !((isalpha(eingabe[i])) || (ispunct(eingabe[i]))) ){
    				printf ("\n Falsche Eingabe!\n Bitte erneut eingeben: ");
    				check=1;
    				break;
    			}
    			++i;
    		}
    	}while(check);
    	strcpy(input, eingabe);
    }
    

    ich übergebe hier an die funktion mein array in das eingelesen wird und den indexwert des arrays.
    ich sage nur buchstaben und satz/sonderzeichen sind erlaubt, da ich keine namen haben will wie simon19...

    wenn ich aber ein ß eingebe schmiert mir das programm ab...hier ein bild der fehlermeldung.
    http://silvio-pedro.de/fehler-%DF.gif

    wie kann ich diesen fehler abfangen? ermöglichen das ich ein ß einlesen kann ohne die funktion komplett umschreiben zu müssen, da ja mehrere char-arrays damit geprüft werden? und wenn das nicht geht auf welche bedingung ich prüfen kann zum abfangen einer solchen eingabe?

    danke und gruß
    pedro



  • wuerdest du freundlicherweise zeile 56 in deinem quellcode markieren?

    benutze auf keinen fall fflush(stdin), ist das klar? benutze stattdessen das:

    int c; while ((c = getchar()) != EOF && c != '\n');
    


  • aber die fehlermeldung verweist nicht auf line 56 in meinen quellcode sondern in der isctype.c und kA was er damit will.. die hab ich net..

    ich binde die ctype.h zwar ein aber trotzdem...

    meine line 56 sieht so aus, ist ein teil meiner scructelemente:

    char monat[dI_TAMO];
    

    im debugger schmiert er mir nicht bei der eingabe ansich ab sondern nach dem while, wenn er in meine if-bedingung springt..

    while(eingabe[i] != 0){
                if ( !((isalpha(eingabe[i])) || (ispunct(eingabe[i]))) ){
                    printf ("\n Falsche Eingabe!\n Bitte erneut eingeben: ");
                    check=1;
                    break;
                }
                ++i;
            }
    

    wenn ich den teil weglasse kann ich es eingeben ohne das er mir abschmiert und ließt das ß als:
    [0] -31 'á' char
    dieses zeichen ein..

    und das mit dem fflush() und deiner lösung werd ich mir ma anschauen, thx.



  • Dir ist hoffentlich klar, daß isalpha() nur auf die Buchstaben des Standard-Alphabets ('a'..'z' und 'A'..'Z') reagiert? (und irgendwo habe ich mal gelesen, daß diese is...() Funktionen Probleme mit signed char und regionalen Zeichen haben können ('ß' liegt jenseits der 0x7F, wird also negativ). Da solltest du dir besser eine eigene Funktion isdalpha() schreiben, die ß und Umlaute abfängt.



  • okay danke, dann werde ich mich mal an einer eigenen is funktion probieren, die auch ß und umlaut zuläßt.



  • Caste den Buchstaben mal nach unsigned char.

    isalpha((unsigned char)eingabe[i])



  • hey klasse das hat geklappt.
    hatte auch schon gecastet, nur hab ich anscheinend was verpeilt dabei.. denn da ging es nicht..

    so, aber jetzt schmiert er mir nicht mehr ab aber er ließt auch kein ß ein sondern bringt die fehlermeldung, klar ist ja kein alpha oder punct.

    aber hauptsache er schmiert mir nicht ab. werd noch schauen wie ich das ganze realisieren werde.

    danke euch allen für die hilfe!

    *edit*
    hab mir jetzt eine eigene prüffunktion geschrieben in der ich nur buchstaben und eni paar sonderzeichen zulasse...

    sieht bischen caotisch aus, aber ich hab jetzt alle möglichen eingabevarianten geprüft und sollte so funktionieren 🙂

    //Prüft Char auf gültige Eingabe
    int isstr(char check, int k, char str[]){
    	// Ist Char Großbuchstabe 
    	if ( check >= 65  && check <= 90 )
    		return 1;
    	// Ist Char Kleinbuchstabe
        else if ( check >= 97 && check <= 122 )
    		return 1;
    	/* Ist Char '.', '-' oder '_' ; steht Leerzeichen nicht am Anfang oder Ende ;
    	 wurde etwas eingegeben*/
    	else if ( check == 45 || check == 46 || (check == 32 && (k != 0 && str[k+1] != 10)) || 
    		check == 95 || (check == 10 && k != 0) )
    		return 1;
    	else{
    		return 0;
    	}
    }
    
    {
    	int i=0,check,k;
    	char eingabe[42];
    
    	do{	// Solange Eingabe bis gültiger String eingegeben wurde
    		check=0;
    		k=0;
    		while(k <= i){
    			eingabe[k] = 0; ++k;}
    		fgets ( eingabe, j, stdin );
    		fflush(stdin);
    		i=0;
    		while(eingabe[i] != 0){ /*Solange bis Stringende erreicht ist oder ein falscher
    								Wert eingegeben wurde*/
    			if ( !(isstr(eingabe[i],i,eingabe)) ){
    				/*Gibt aktuellen Wert an Prüffunktion. Ist Wert gültig wird Returnwert negiert um die 
    				Anweisung zu überspringen. Ist Eingabe Falsch, Fehlerausgabe und Schleifenabbruch*/
    				printf ("\n Falsche Eingabe! Es sind nur Buchstaben '.', '-' und '_' erlaubt!"
    					"\n Bitte erneut eingeben: ");
    				check=1;
    				++i;
    				break;
    			}
    			++i;
    		}
    	}while(check);	
    	eingabe[strlen(eingabe)-1] = 0; // Lösche Line Feed vor Stringende
    	strcpy(input, eingabe); // kopiere Eingabe in Structelement
    }
    


  • Nur so als kleinen Tip...

    Wenn Du ein Bool-Array machen würdest mit 256 Stück, dann könntest Du das eingegebene Zeichen als index auffassen und dort im array jeweils true oder false hinterlegt haben für 'erlaubt' und 'verboten'. Das lässt sich dann sehr bequem wieder verwenden, super anpassen (gerade auch für nicht im ASCII zusammenhängende Zeichenreihen) und ist außerdem sehr übersichtlich.


Anmelden zum Antworten