PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c programm



darxun
18-11-2007, 10:52
Aufgabe:

Erstellen Sie ein C-Programm, das auf dem Bildschirm um die Eingabe eines Buchstabens
bzw. Zeichens bittet. Speichern Sie dieses Zeichen in einer Variablen vom Typ char.
Dann wird in einer Tabelle
• das eingegebene Zeichen
• seine (Dezimal-) Nummer im ASCII-Code (für die Eingabe mit dem Numblock)
• die gebräuchlichere Hexadizimalnummer
• und der Oktalwert
angezeigt (siehe Bild). Probieren Sie dieses Programm mit „normalen“ Buchstaben und
Ziffern aus. Verifizieren Sie die Ausgabe, indem Sie statt eines Buchstaben dessen Tastenkombination
auf dem Num-Block drücken (So sollte z.B. bei <Alt>+65, also drücken
und Halten der <ALT>-Taste, Eingabe der 65 auf dem Num-Block, Loslassend der Alt-
Taste, ein großes A angezeigt werden)

Frage:

wie kann ich mit C einen ascii code in dez./hex./okt.-werte umrechnen? gibt es dazu einfache befehle? oder muss man die rechnung irgendwie in ihren einzelschritten eingeben?

oder einfach alle zeichen der ascii-tabelle (http://de.wikipedia.org/wiki/ASCII-Tabelle) mit dem eigegebenen wert vergleichen?

lokicall
18-11-2007, 11:41
Musst du die Umrechnung selber implementieren oder kannst du die Ausgabe von printf (http://www.cplusplus.com/reference/clibrary/cstdio/printf.html) nutzen?

darxun
18-11-2007, 12:07
ich kann printf benutzen, es soll halt so ne tabelle rauskommen...

siehe auch:
http://www.itm.tum.de/lehre/informationstechnik/download/software-engineering/aufgabenblaetter/ws/Aufgabenblatt_SE2.pdf

MasterFX
18-11-2007, 14:08
Is doch einfach


#include <stdio.h>

int main(){
char zeichen;

while(1){
printf("\n\nBitte geben sie ein beliebiges Zeichen ein: ");
scanf("%c",&zeichen);
printf("\n-----------------------------------------------------");
printf("\n| ASCII | Dez. | Hex. | Okt. |");
printf("\n-----------------------------------------------------");
printf("\n| %c | %2d | %2X | %o |",zeichen,zeichen,zeichen,zeichen);
printf("\n-----------------------------------------------------");
fflush(stdin);
}
}

jeebee
18-11-2007, 14:59
Zur Erklärung: ein char ist in C ein integraler Typ, d.h. eine Ganzzahl, man kann damit rechnen wie mit short,int und long! Wenn man Buchstaben als char's speichert, wird der dem Buchstaben entsprechende ASCII-Wert in die char-Variable geschrieben. diesen ASCII-Wert kann man dann z.B. mit printf("%2d", var); als Dezimalwert oder mit printf("%2X", var); als Hex-Wert ausgeben.

darxun
18-11-2007, 20:16
also erst mal vielen dank!

leider werden umlaute (ü ö ä...) nicht wirklich richtig angezeigt, wie kann man das noch verbessern?

MasterFX
19-11-2007, 08:24
Das Problem liegt in der Zeichencodierung der Konsole.Die Konsole verwendet einen anderen Zeichensatz als der C-Compiler. Das könntest du in den griff bekommen wenn du die Codepage der Konsole änderst.

jeebee
19-11-2007, 14:07
Umlaute haben keine ASCII-Kodierung (vgl. mit der ASCII-Tabelle im Link des Thread-Erstellers), daher werden sie auch nicht korrekt dargestellt.

Mini-Test:

#include <stdio.h>

int main() {
printf("%c | %3d | %2X | %3o \n", 'ä', 'ä', 'ä', 'ä' );
return 0;
}

gibt beim Kompilieren mit
gcc -Wall prog.c folgende Meldungen

prog.c:4:36: Warnung: Zeichenkonstante mit mehreren Zeichen
prog.c:4:42: Warnung: Zeichenkonstante mit mehreren Zeichen
prog.c:4:48: Warnung: Zeichenkonstante mit mehreren Zeichen
prog.c:4:54: Warnung: Zeichenkonstante mit mehreren Zeichen

MasterFX
19-11-2007, 15:03
ASCII sind 127 Zeichen, die anderen 127 können entweder DOS oder PC Zeichensatz sein. Diese unterscheiden sich natürlich.
Die Meldung


prog.c:4:36: Warnung: Zeichenkonstante mit mehreren Zeichen

bekommst du weil du dein Quellcode mit UTF8 Codierung genommen hast, dann bekommen die Umlaute natürlich 16Bit. Wenn ich DOS Zeichensatz nehme habe ich keinerlei Warnungen. Um die Umlaute allerdings verabeiten zu können muss ich meine Codepage ändern.
Daher ergibt die Ausgabe von:


#include <stdio.h>

int main() {
int i,j;
for(i = 0; i <= 0xF; i++){
for(j = 0; j <= 0xF; j++)
printf("%c ", (i<<4) | j);
printf("\n");
}
}

Auch sowas


☺ ☻ ♥ ♦ ♣ ♠
♫ ☼
► ◄ ↕ ‼ ¶ § ▬ ↨ ↑ ↓ → ← ∟ ↔ ▲ ▼
! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z [ \ ] ^ _
` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~ ⌂
Ç ü é â ä à å ç ê ë è ï î ì Ä Å
É æ Æ ô ö ò û ù ÿ Ö Ü ø £ Ø × ƒ
á í ó ú ñ Ñ ª º ¿ ® ¬ ½ ¼ ¡ « »
░ ▒ ▓ │ ┤ Á Â À © ╣ ║ ╗ ╝ ¢ ¥ ┐
└ ┴ ┬ ├ ─ ┼ ã Ã ╚ ╔ ╩ ╦ ╠ ═ ╬ ¤
ð Ð Ê Ë È ı Í Î Ï ┘ ┌ █ ▄ ¦ Ì ▀
Ó ß Ô Ò õ Õ µ þ Þ Ú Û Ù ý Ý ¯ ´
* ± ‗ ¾ ¶ § ÷ ¸ ° ¨ · ¹ ³ ² ■

Und was sehe ich da, ahh die Umlaute nach DOS-Erweiterung.

jeebee
19-11-2007, 18:27
hmm, stimmt, hab natürlich nicht daran gedacht meine Datei als nicht UTF-8 abzuspeichern...

Edit: @darxun: Aber wenns nur um ASCII-Zeichen geht, kannst du das mit den Umlauten getrost weglassen, die gehören nicht zu ASCII.

lokicall
19-11-2007, 22:38
ASCII sind 127 Zeichen, die anderen 127

Kleine Korrektur:

ASCII sind die 128 Zeichen und die anderen 128 sind abhängig vom Zeichensatz.:D

darxun
20-11-2007, 15:00
was müsste ich ändern, um ganze zahlen (die für das jeweilige ascii-symbol stehen) einzugeben?

der computer soll mir praktisch bei der eingabe von '97' ein 'a' und bei '43' ein '+' etc... ausgeben.

BLUESCREEN3D
20-11-2007, 15:34
was müsste ich ändern, um ganze zahlen (die für das jeweilige ascii-symbol stehen) einzugeben?
Du musst zumindest die Parameter von scanf() ändern.
Wie genau, findest du selber raus.

darxun
24-11-2007, 10:37
Bei diesem Code wird zwar eine ganze Zahl eingelesen, und auch als richtiges ASCII-Symbol ausgegeben.


#include <stdio.h>

int main()
{
unsigned char cASCII;

printf("\n\nBitte geben sie ein beliebiges Zeichen ein: ");

scanf("%d",&cASCII);

printf("\n-----------------------------------------------------------------");
printf("\n|\tASCII\t|\tDez.\t|\tHex.\t|\tOkt.\t|");
printf("\n-----------------------------------------------------------------");

/*d für Dez., X für Hex., o für Okt.*/

printf("\n|\t%c\t|\t%2d\t|\t%2X\t|\t%o\t|", cASCII, cASCII, cASCII, cASCII);
printf("\n-----------------------------------------------------------------\n\n");

return 0;
}

Allerdings erscheint in einem Dialogfenster folgende Meldung:

------------------------
Debug Error!

Program: ...
Module: ...igene Dateien/Visual Studio 2005/Projekts/SE23/debug/SE23.exe
File:

Run-Time Check Failure #2 - Stack around variable 'cASCII' was corrupted.
-------------------------

Was will mir mein Computer sagen? ;-)

jeebee
24-11-2007, 10:53
Dass du beim Einlesen mehr schreibst, als du solltest. Du hast ein unsigned char cASCII (1 Byte) und schreibst mehr als ein Byte, falls du eine Zahl > 255 eingibst.

Damit überschreibst du möglicherweise andere Variablen.

darxun
24-11-2007, 12:14
Die Meldung erscheint leider auch wenn ich Zahlen <=255 eingebe.

Der Debugger beschwert sich übrigens nicht.

sommerfee
24-11-2007, 12:35
Die Meldung erscheint leider auch wenn ich Zahlen <=255 eingebe.

Dem Prozessor ist es egal, ob die Zahl 0 oder 23984378 ist, ein char ist ein char und ein int ist ein int, egal was dort drinsteht. Und wenn man an eine Stelle im Stack, wo nur Platz für ein char ist, ein int speichern läßt, werden 3 Bytes des Stacks zuviel überschrieben. (Vorausgesetzt sizeof(char)==1 && sizeof(int)==4)



Der Debugger beschwert sich übrigens nicht.

Was wohl daran liegt, daß bei lokalen Variablen der Stack immer in Vielfachen von "int" intern angepasst wird. Richtiger wird der Programmcode dadurch aber nicht, scanf( "%d", &c ) (mit c=char) ist und bleibt elementar falsch.

Gruß,
Axel

darxun
24-11-2007, 13:17
Ok danke, jetzt habe ich das auch verstanden.

mfg

BLUESCREEN3D
25-11-2007, 18:36
Du solltest bei deinem Compiler die Warnungen einschalten.
Dann hättest du vermutlich eine Meldung gekriegt, dass %d und char nicht zusammenpassen.