toupper



  • Hallo,

    die Aufgabe lautet toupper selbst nachzuprogrammieren.

    Bis auf ä,ö,ü funktioniert es auch. Aber eben nicht bei diesen Sonderzeichen

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void tuopper_(char *eingabe){
    int i;
    	for(i=0;i<=strlen(eingabe);i++){				//Rest
    		if(eingabe[i] >96 && eingabe[i]<123){
    			eingabe[i]-=32;
    		}
    		else if(eingabe[i]==129){					//ü->Ü
    			eingabe[i]=154;
    		}
    		else if(eingabe[i]==132){					//ä->Ä
    			eingabe[i]=142;
    		}
    		else if(eingabe[i]==148){					//ö->Ö
    			eingabe[i]=153;
    		}
    	}
    }
    
    int main(){
    
    	char eingabe[50];
    
    	printf("Geben sie einen Buchstaben oder einen ganzen Satz ein.\n");
    	fgets(eingabe,50,stdin);
    	tuopper_(eingabe);
    	printf("\n%s\n",eingabe);
    
    	system("PAUSE");
    	return 0;
    }
    

    Wie kann man das lösen?



  • Wo hast du denn die Codierung (Zahlenwerte) für die Umlaute her?



  • Und toupper bearbeitet nur ein Zeichen.

    Du hast ein strtoupper programmiert.



  • aus der ASCII Tabelle



  • Kann nicht sein - ASCII kennt nur Zeichen bis 127.



  • Es ist auch nicht (vom Standard) festgelegt, ob ein [c]char[\c] signed oder undigned ist.
    Wenn es auf deinem System mit Vorzeichen ist, dann liegt 129 meist schon ausserhalb des Wertebereichs.



  • Ich hab nach ASCII-Tabelle gegoogelt, bin auf folgenden link gestoßen

    http://www.chip.de/ii/1/2/5/4/9/5/8/0/ascii-93c823e7009f26b0.png

    dann bin ich mit ö,ä,ü genauso verfahren wie mit den anderen Zahlen.

    Habe es auch mit unsigned char probiert, das geht auch nicht.

    Wie könnte ich es sonst lösen?



  • Warum schlägst du nicht mal auf Wikipedia bei ASCII nach?

    toupper2 schrieb:

    Wie könnte ich es sonst lösen?

    Lass dir in der Schleife (vor der Änderung) mal die Zeichen ausgeben.

    printf("%c = %d\n", eingabe[i], eingabe[i]);
    


  • das habe ich gemacht, dann erhalte ich

    -10 ö
    -42 Ö
    -4  ü
    -36 Ü
    -28 ä
    -60 Ä
    

    aber auch wenn ich sage if(eingabe == -10)dann eingabe = eingabe -32 funktionierts nicht.

    Ist eine Ausgabe dieser sonderzeichen überhaupt möglich?



  • Wenn die Zeichen bei der Eingabe auf dem Terminal stehen, kann man sie auch ausgeben.

    Zeig mal dein komplettes Programm. Mittlerweile hast du ja an verschiedenen Stellen Änderungen.



  • Auf modernen Systemen wird UTF-8 (Unicode) verwendet. Dabei werden Zeichen außerhalb des ASCII-Raumes mit mehreren Bytes (chars) dargestellt. Daher ist ein einfaches toupper nicht mehr möglich. Übrigens der Unicode-Standard enthält einen Algorithmus für richtiges "Case-Mapping".



  • DirkB schrieb:

    Zeig mal dein komplettes Programm. Mittlerweile hast du ja an verschiedenen Stellen Änderungen.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void tuopper_(char *eingabe){
    int i;
        for(i=0;i<=strlen(eingabe);i++){                //Rest
            if(eingabe[i] >96 && eingabe[i]<123){
                eingabe[i]-=32;
            }
            else if(eingabe[i]==-4){                   //ü->Ü
                eingabe[i]=-36;
            }
            else if(eingabe[i]==-28){                   //ä->Ä
                eingabe[i]=-60;
            }
            else if(eingabe[i]==-10){                   //ö->Ö
                eingabe[i]=-42;
            }
        }
    }
    
    int main(){
    
        char eingabe[50];
    
        printf("Geben sie einen Buchstaben oder einen ganzen Satz ein.\n");
        fgets(eingabe,50,stdin);
        tuopper_(eingabe);
        printf("\n%s\n",eingabe);
    
        system("PAUSE");
        return 0;
    }
    


  • Welches System (Windows/Linux/? )nutzt du?
    Welche Version?

    Bei mir kommt kommt bei Windows 7
    ü = -127
    Ü = -102
    ö = -108
    Ö = -103
    ä = -124
    Ä = -114

    raus.

    Wenn ich die Werte einsetzt klappt das auch.

    Deine Schleife läuft um Eins zu weit. Es reicht auf kleiner zu testen: i<strlen(eingabe)
    In C testet man aber i.A gleich auf den Stringterminator: i!='\0'



  • DirkB schrieb:

    In C testet man aber i.A gleich auf den Stringterminator: i!='\0'

    Müsste dann aber richtig lauten: eingabe[i]!='\0'

    Statt eingabe[i] kannst du in deinem Fall auch *eingabe verwenden. Das Inkrementieren am Ende jedes Schleifendurchlaufs wird mit eingabe++ erreicht und damit kann auf die Variable i verzichtet werden.

    Zu Beginn deiner Funktion könnte sicherheitshalber noch die Prüfung von eingabe auf NULL erfolgen.



  • Ups! 😮 Schäm.



  • DirkB schrieb:

    Welches System (Windows/Linux/? )nutzt du?
    Welche Version?

    Bei mir kommt kommt bei Windows 7
    ü = -127
    Ü = -102
    ö = -108
    Ö = -103
    ä = -124
    Ä = -114

    raus.

    Wenn ich die Werte einsetzt klappt das auch.

    Habs jetzt mal auf meinem Home-PC(Win7) ausprobiert und dort erhalte ich auch diese Zahlen und es klappt.
    Zuvor hatte ich es auf meinem Laptop probiert(Win8.1), dort hatte ich die anderen Zahlen 😮

    Thx 👍



  • Warum benutzt Du nicht die Zeichen, also etwa
    if(eingabe[i]=='ü') //ü->Ü
    eingabe[i]='Ü';
    Das hat den Vorteil, dass es mit allen Codes funktioniert.



  • Das hat den Nachteil, dass es gerade nicht mit allen Codes funktioniert.



  • Wenn du MS visual Studio hast, solltest du dir den Menüpunkt DATEI -> Erweiterte Speicheroptionen... anschauen. Dort sind alle Zeichencodierung aufgeführt in denen der Quelltext gespeichert werden kann.

    Für die Windows Console ist der Zeichensatz in der Regel Codepage 850:

    http://de.wikipedia.org/wiki/Codepage_850

    Ä ist dort Hex 8E -> Dez -114/142


Anmelden zum Antworten