Einzelnen Beitrag anzeigen
Alt 27.05.2001, 22:13   #9
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Hallo mode2 !

Einen char vereinbarst Du und es ist eine einstellige (1 Byte große) Datenvariable, die den Wert 0 bis 255 aufnimmt, oder falls es eine vom Datentyp her signed char Variable ist, kann man damit die Werte -128 bis +127 ablegen, das mit dem +/- oder Absolutwert 0-255 ist Ansichts- und auch - logischerweise - Definitionssache. Wie Du eben die Variable vereinbarst.

char ch; /* 1 ASCII-Zeichen für den Charactercode, standardmäßig signed char !!, sonst explizit unsigned char verwenden um positive Zahlen verwenden zu können, das wäre dann 0-255, falls mit Umlauten verglichen wird z.B. mit einem 'ä' (ist größer als 127), dann funktioniert der Vergleich mit einer signed char Datenvariable auch so, bei Angabe des dezimalen (numerischen) ASCII-Codewerts muß ein negativer Wert verwendet werden (Zweierkomplement) */

char *p_ch; /* Zeiger auf einen Wert vom Datentyp [signed] char */
char a_name[20]; /* maximal 19 stelliges Character-Array + Nullbyte */


Um zum Ascii-Code eines Buchstabens zu kommen, brauchst Du eine sogenannte ASCII-Codetabelle, da werden dann die Codes für die Zeichen 0 bis 127 oder sogar darüber hinaus (128-255) für einen spezifischen nationalen Zeichensatz (z.B. PC850 Westeuropa in MS-DOS) tabellarisch in irgend einer allgemeingültigen Form aufgelistet. Mit Dezimalcode, Hexcode, Oktalcode, Characterzeichen, Signalname (z.B. dezimal 27 = ESC Zeichen).

Die Großbuchstaben beginnen bei 65 (= A) und enden mit 90 (=Z), um zu den Kleinbuchstaben zu kommen, mußt Du nur das Bit 5 (= dezimal 32) zu z.B. 65 hinzuzählen, dann erhältst Du den Dezimalcode für das kleine "a".

Also, besorge Dir eine ASCII-Tabelle. Ein Link dazu steht ja bereits im Thread angeführt.

>>>>>>>>>>> Wie druckt man nun eine Charvariable am Bildschirm aus ?

printf("Zeichencode: %c", ch);

Also, schau Dir den Befehl printf - besser gesagt die Funktion printf - in einem C-Lehrbuch an. In C++ geht es einfacher, mit:
cout << "Zeichencode: " << ch;

Der Funktionsaufruf für printf bzw. cout blablabla für den Zeiger, der so gesetzt sein muß: p_ch= &ch; /* Zeiger p_ch erhält die Adresse von ch, Adresse mittels address-of Operator '&' */ müßte vom Prinzip her so aussehen:

printf("Zeichencode: %c", *p_ch); /* Zugriff auf den Character-Datenwert durch p_ch mittels des '*'-Operators */
cout << "Zeichencode: " << *p_ch;

printf bzw. cout blablabla für die erste Stelle (das erste Element) des Character-Array a_name[Anzahl_der_Elemente+1];
printf("Zeichencode: %c", a_name[0]); /* Zugriff auf den Character-Datenwert durch a_name Position 0, in C und C++ beginnt man bei 0 zu zählen !
cout << "Zeichencode: " << a_name[0];

Will man auf die 2.Stelle des Arrays zugreifen, schreibt man a_name[1], die Schreibweise kann auch anders lauten, nämlich: *(a_name+1).

Für die 1.Stelle reicht *a_name, a_name ist sozusagen die Anfangsadresse des Arrays, mit dem *-Operator greifst Du dann aber bereits auf eines der ! DATEN... ! -Elemente des (in diesem Fall char-)Arrays zu.

Alles klar, ja, dann tu schön weiter. Vergiß nicht strukturiert und überlegt zu entwerfen, wie auch zu codieren.

Mit der Funktion strcmp(string1,string2) kannst Du den Vergleich machen, vorher solltest Du die Strings mit einer anderen Funktion strupper(string1); strupper(string2); in Großbuchstaben umwandeln. Funktioniert aber nicht für die Umlaute, am besten eine eigene Routine schreiben mittels for-Schleife durch das 'Array' von 'chars' durchlaufen und fragen/durchführen: if(*p_ch=='ä') *p_ch='Ä'; gleiches für das 'ö' und das 'ü'. Das Ende erkennst Du durch das Null-Zeichen im Characterarray bzw. String.

/* Funktion mystrupper, 20010527 myname=Autor, keine Veränderungen
String auf Großschreibung bringen
--------------------------------------------------------------------*/
int mystrupper(char *string)
{

if(!string) return -1; /* der Nullpointer wurde übergeben ! ? */

/* for - Schleife zum Umwandeln in Großschreibung */

/* Schleifenkopf des for-Befehls, bestehend aus:
1 = Vorbereitung, einmalige Inititalisierung von Daten- und Adreßvariablen, Anweisungen werden durch Kommata getrennt
2 = Vergleichsbedingung positiv, diese Bedingung muß wahr sein (numerisch <> 0, damit mit der Schleifenbehandlung fortgefahren wird
3 = Increment / Decrement

ad 1): einmal vor allem anderen auszuführen, "Initialisierung"
ad 2): jedesmal VOR dem Ausführen des Schleifenkörpers abzufragende Bedingung, die auf positiv testen muß
ad 3): jedesmal NACH dem Durchlauf des Schleifenkörpers auszuführende Operationen, die zum Hoch- oder Niederzählen von Zählern oder Zeigern dienen, können auch mehrere Anweisungen sein, durch Kommata getrennt

der Befehl break + ";" dient zum (vorzeitigen) Verlassen der Schleife, ohne daß weitere Anweisungen ausgeführt werden

der Befehl continue + ";" dient zum (vorzeitigen) Ausführen des Increment/Decrement-Teils mit anschließender Testung der Schleifenbedingung und dem wiederholten Ausführen des Schleifenkörpers, falls die Bedingung positiv testet

*/

for ( /*keine Vorbereitung notwendig, wozu auch */
; *string /* Vergleich, ob die aktuelle Stringposition (noch) ungleich Null ist */
; string++ /* String - Pointer - Variable um ein Element (=1 Byte) hochzählen */
)
{ /* Beginn des Schleifenkörpers der for-Schleife */

if(*string>='a' && *string<='z') *string-= 32; /* 32 vom ASCII-Code des kleinen Buchstabens abziehen, um zum großen Buchstaben zu kommen */

else /* falls es kein Kleinbuchstabe war, dann halt hier weiter, jedenfalls kein *string-= 32; !! */

{ /* Beginn des 1.else-Zweiges zu if(*string>='a' ... */

if(*string=='ä') *string='Ä';
else if(*string=='ö') *string='Ö';
else if(*string=='ü') *string='Ü';

} /* Ende 1.else */

} /* Ende des for-Schleifenkörpers */

return 0;

} /* mystrupper */


>>>>>>>>>>> Wie vergleichst Du nun ?
kikakater ist offline   Mit Zitat antworten