PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: Zeichensatz ausgeben



Stefan Feeser
25-07-2006, 15:25
Hallo zusammen,

ich habe folgendes Programm zum Ausgeben des Zeichensatzes des jeweiligen Rechners geschrieben:



# include <stdio.h>
# include <ctype.h>

void main(void) {
int i_max;
signed char c_zeich;

i_max = 9;

printf("\n\tASCII-Zeichensatzausgabe:\n\n");
for (c_zeich = 0; c_zeich < 256; c_zeich++) {
if (isprint(c_zeich)) {
printf("\t%d:%c", c_zeich, c_zeich);
} else if (isdigit(c_zeich)) {
printf("\t%d:%d", c_zeich, c_zeich);
} else {
printf("\t%d:-", c_zeich);
}
if (c_zeich == i_max) {
printf("\n");
i_max = i_max + 10;
}
}
printf("\n\n");
}


Ich würde nun gerne wissen ob ich das auch mittels Escapesequenzen ausgeben könnte.

Ich denke da an sowas wie



printf("\033[Zeichensatznummer");


Daneben würde mich auch interessieren ob man Charactervariablen verschmelzen kann (so wie in Perl Variable_a = Variable_alt . Variable_b;)?

Wieder mal viele Fragen eines Anfängers:)

Gruss

Stefan

locus vivendi
25-07-2006, 17:19
signed char c_zeich;
[...]
if (isprint(c_zeich)) {

Das ist unportabel und könnte gefährlich sein. Die Zeichenklassifizierungsfunktionen die nur einen Parameter haben erwarten, dass der Wert der an sie übergeben wird in ein unsigned char passt, oder EOF ist. Wenn du alle signed char Werte durchläufst triffst du also auf welche für die das nicht der Fall ist. Ich weiß nicht ob das Programm wirklich in C sein muss - wenn nein kannst du die entsprechenden Klassifizierungsfunktionen die zwei Parameter haben aus dem C++ Standard Header <locale> verwenden. Die können im Prinzip auch mit signed char umgehen.

Deine Schleife kommt mir sowieso dubios vor, denn auf Systemen auf denen signed char nur 8 Bits hat wirst du sicherlich nicht Werte bis 255 erleben.



void main(void) {[...]
Das geht auch nicht. main gibt ein int zurück, sowohl in C als auch in C++.

Stefan Feeser
25-07-2006, 17:43
Hi,

das Programm muss in C sein und die 256 hatte ich zum testen eingegeben. Allerdings habe ich auf meinem Rechner in der Tat hier Fehler erhalten. Mit 127, also für unsigned char hat es funktioniert.

Ich hatte allerdings ausprobiert die Variable mit unsigned char zu deklarieren, das wurde mir jedoch vom Compiler auf dem Linuxrechner (SuSE 9.1, gcc 3.3.3) angemeckert. Warum kann ich mir allerdings nicht erklären!

Das ich die Hauptschleife mit void deklariert habe liegt am Kurs, den ich mache, dort ist nahezu in jedem Beispiel void angegeben. Es wurde auch erklärt, dass die Hauptschleife ja weder eine Rückgabewert zurückgeben muss (darum void als Rückgabewert) noch einen Inhalt hätte. Wenn ich statt void int einsetze bekomme ich vom Compiler keine Warnhinweise mehr, aber kannst Du vielleicht mal kurz detailierter Schildern warum ich vielleicht doch int nehmen sollte?

Gruss und Danke

Stefan

Boron
25-07-2006, 18:41
Die Main-Funktion sollte beim Programmende einen int Wert an das Betriebsystem zurückliefern.
Dieser Wert dient zur Anzeige von Erfolg oder Misserfolg der Programmaufrufs. Bei Misserfolg kann der Wert einen bestimmten Fehler benennen.

Wenn du dein Programm z.B. in einem Skript aufrufen willst, und dasSkript wissen muss, ob das Programm erfolgreich arbeiten konnte oder nicht, dann ist dieser Rückgabewert wichtig.

locus vivendi
25-07-2006, 18:49
Ich hatte allerdings ausprobiert die Variable mit unsigned char zu deklarieren, das wurde mir jedoch vom Compiler auf dem Linuxrechner (SuSE 9.1, gcc 3.3.3) angemeckert. Warum kann ich mir allerdings nicht erklären!
Wahrscheinlich passt unsigned char nicht zu irgendwelchen anderen Programmteilen. Du musst aber auch gar nicht die Variable als unsigned char deklararien. Du kannst auch char oder signed char nehmen und nach unsigned char casten wenn du isprint aufrufst.


Das ich die Hauptschleife mit void deklariert habe liegt am Kurs, den ich mache, dort ist nahezu in jedem Beispiel void angegeben. Es wurde auch erklärt, dass die Hauptschleife ja weder eine Rückgabewert zurückgeben muss (darum void als Rückgabewert) noch einen Inhalt hätte.
Hauptschleife oder Hauptprogramm (sprich main-Funktion)? Wenn die dir in deinem Kurs wirklich gesagt haben, dass ihr void main benutzen sollt, dann glaube ihnen kein Wort! Dann glaube ihnen am besten auch den ganzen Rest den sie erzählen nicht ohne es nachzuprüfen. Wenn sie solche einfachen Dinge schon falsch machen, lässt das nichts Gutes ahnen.


Wenn ich statt void int einsetze bekomme ich vom Compiler keine Warnhinweise mehr, aber kannst Du vielleicht mal kurz detailierter Schildern warum ich vielleicht doch int nehmen sollte?
"void main()" ist schlichtweg nicht portabel. Ein Compiler kann eine solche Form als Erweiterung erlauben. Aber "int main(void)" geht immer. Also warum "void main()" benutzen?

Übrigens ist mir noch etwas aufgefallen. Du benutzt in den printfs %d und übergibst dann für diese Position ein signed char. Das dürfte eigentlich auch nicht richtig sein. Für %d muss es ein int sein.

Stefan Feeser
26-07-2006, 11:52
Hi,

danke für die Infos. Ich habe mich gestern auch nochmal ein wenig schlau gemacht. Der Rückgabewert 2 bedeutet in UNIX, dass es sich um einen kritischen Fehler handelt. Meines Wissens wäre 3 ein undefinierter Fehler und 1 ein Warnhinweis, 0 bedeutet, dass das Programm korrekt ablief.

Wenn ich also die Funktion main() mit int deklariere, sollte man dann zwingend auch eine 0 zurückgeben? Und warum liefern sowohl die als void, wie auch als in deklariert in meinem Programm beide Hauptfunktionen 2 zurück?

Das mit dem %d an welches ich eine char-Variable übergeben habe, hatte ich aus einem Buch (Titel grade nicht greifbar), dort war dieses Beispiel für das Auslesen eines Zeichensatzes angegeben. Mich hat auch gewundert, dass man eine char-Variable übergibt. Aus diesem Grund vielleicht nochmal zurück zu meiner ursprünglichen Hauptfrage.

Wie lese ich in C am sinnvollsten den Zeichensatz aus? Gibt es eine Lösung mittels printf (kann man mittels Escapesequenzen auch Zeichen auslesen?)?

Daneben würde mich dann noch interessieren wie ich auslesen kann ob der auf dem System verwendete Zeichensatz 128 oder 256 Zeichen (signed char 8 oder mehr Bit groß ist) umfasst?

Gruss

Stefan