toupper
-
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
Ä = -114raus.
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
Ä = -114raus.
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 ZahlenThx
-
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