Buchstabenumwandlung
-
Sehr schön, wieder was dazu gelernt.
-
Dann kann man Bit 5 ja gleich toggeln und braucht es nicht nochmal abzufragen:
// für jedes Zeichen for (i=0; i < laenge; i++){ // wenn es ein Buchstabe ist if (wort[i] >= 'a' && wort[i] <= 'z' || wort[i] >= 'A' && wort[i] <= 'Z') // Bit 5 toggeln wort[i] ^= 0x20; }
-
Wau, danke für die prompte Hilfe! allerdings kann ich mit dem letzten beitrag relativ wenig anfangen. was sind denn toggeln?
ok, ich habe das Programm jetzt soweit editiert. Es wandelt alles schön um. Jetzt komme ich dadurch allerdings direkt zum nächsten problem: es wandelt wie gesagt alles um. allerdings sollen sonderzeichen und zahlen stehen bleiben. meine überlegung war jetzt einfach am anfang alles bis auf die Zalenbereiche 65-90 und 97-122 auszuklammern. aber, wie mache ich das am elegantesten?
*edit*
mit toupper und tolower hatten wir shcon ein funktionsfähiges programm in einem Lehrbuch gefunden, allerdings durften wir diese funktionen nicht benutzen
so sieht das programm jetzt aus:
#include <stdio.h> #define MAXLENGTH 2000 int main (void) { char wort[MAXLENGTH]; int laenge; char i; printf("Bitte wort eingeben: "); scanf( "%s" , &wort); laenge= 0; while (wort[laenge] != '\0') laenge++; for (i=0; i < laenge; i++) { if (wort[i]<=96 ) // hier würde dann die 'ausklammerung' stattfinden wort[i] += 32; else wort[i] -= 32; } printf( "%s\n\n" , wort); printf( "Die laenge der Zeichenkette ist %i\n", laenge); printf( " i3 liegt bei %i\n", i ); printf( " oder %c\n" , i); return 0; }
-
Meine eben geposteter Code erledigt alles, was du machen willst.
Er wandelt wirklich nur die Buchstaben ineinander um. Keine Sonderzeichen, Zahlen, etc.Toggeln:
Wie net schon geschrieben hat unterscheiden sich Groß- und Kleinbuchstaben nur am 5. Bit:
a: 0110.0001 A: 0100.0001
Das bedeutet, wenn du Groß- in Kleinbuchsatben und umgedreht umwandeln willst, brauchst du nur das Bit Nummer 5 "umzuschalten". Also, wenn ne 0 dasteht machste ne 1 draus und andersherum. Das nennt sich toggeln.
Das wird in ner Programmiersprache mit einer XOR-Verknüpfung erledigt:
0110.0001 (a) XOR 0010.0000 (0x20) ------------------------ 0100.0001 (A) und nun zurück: 0100.0001 (A) XOR 0010.0000 (0x20) ------------------------ 0110.0001 (a)
Wie du siehst, kannst du mit einer Operation (XOR 0x20) zwischen Groß- und Kleinbuchstaben "umschalten". XOR wird in C mit dem Zeichen '^' dargestellt.
-
"toggeln" bedeutet einfach, daß ein Bit zwischen 0 (aus) und 1 (an) umgeschaltet wird (das macht DathZiu mit der XOR-Konstruktion "wort[i]^=0x20;").
Ansonsten kannst du mehrere Bedingungen per && (UND) bzw. || (ODER) miteinander verknüpfen, um die "erlaubten" ASCII-Bereiche auszufiltern.
-
@ DarthZiu & CStoll:
Vielen Danke für die Super erklärung! Allerdings habe ich es selbernochmal versuchen müssen, da wir das Programm vorstellen müssen. da wir toggeln noch nicht behandelt haben könnte das dann auffallen
So, soweit habe ich das proggi jetzt fertig. macht alles so wie es soll. jetzt habe ich nur noch eine Frage: wie stell ich das an, dass der auch leerzeichen mitnimmt; sprich, dass er einen ganzen Satz umwandelt?
ich habe mal irgendwas mit getchar und putchar gelesen, aber keine eindeutige erklärung finden können.
#include <stdio.h> #define MAXLENGTH 2000 int main (void) { char wort[MAXLENGTH]; int laenge; char i; printf("Bitte wort eingeben: "); scanf( "%s" , &wort); laenge= 0; while (wort[laenge] != '\0') laenge++; for (i=0; i < laenge; i++) { if( wort[i]>=65 &&wort[i]<=90 || wort[i]>=97 && wort[i]<=122 ) if (wort[i]<=90 ) wort[i] += 32; else wort[i] -= 32; } printf( "\nUmwandlung: %s\n\n" , wort); return 0; }
-
So, soweit habe ich das proggi jetzt fertig. macht alles so wie es soll. jetzt habe ich nur noch eine Frage: wie stell ich das an, dass der auch leerzeichen mitnimmt; sprich, dass er einen ganzen Satz umwandelt?
Dazu kannst du fgets() für die Eingabe verwenden (oder auch "scanf("%[^\n]",wort);")
PS: Wieso machst du eigentlich zwei Schleifen? Das kannst du doch zusammenfassen:
while(wort[i]!='\0' { if(...) i++; }
oder
for(i=0;wort[i]!='\0';++i) ...
-
hm, mit der ersten zähle ich, wieviele buchstaben das wort hat und bei der zweiten sage ich: breche ab, wenn du alle buchstaben durchgearbeitet hast. ka, ob man das noch großartig anders schreiben kann, habe erst vor knapp 3 monaten mit c angefangen, deshalb sieht alles noch ein bischen wüst aus
-
Da ist es doch einfacher zu sagen "arbeite so lange, bis du das Wortende erreicht hast" (siehe die Code-Schnipsel in meinem vorigen Beitrag)
-
campinge schrieb:
Allerdings habe ich es selbernochmal versuchen müssen, da wir das Programm vorstellen müssen. da wir toggeln noch nicht behandelt haben könnte das dann auffallen
Das seh ich aber völlig anders: Du kannst doch sagen, dass du im www gefunden hast, dass sich Groß- und Kleinbuchstaben nur an Bitstelle 5 unterscheiden.
Und dann hast du dich hier http://de.wikipedia.org/wiki/Bitmaske#Bit_umschalten_.28toggle.29 belesen, wie dass mit dem Umschalten funktioniert. Wär ja schlimm, wenn du in der Schule dafür "bestraft" wirst, eigenständig zu denken.
-
hm, ist auch ne gute idee.
ich habe mal beide Programme fertiggemacht und lasse dann die anderen aus meine mteam entscheiden, ob sie was lernen möchten oder nicht
Auf jeden fall vielen Dank nochmal für eure fixe Hilfe! ich werd bestimmt noch öfters mal vorbeischaun, lol