Malloc ASCII Tabelle

Clooney89

Grünschnabel
Guten Tag,

ich bin absoluter Anfänger in C und muss folgende Aufgabe lösen:


Schreiben Sie ein Programm, das zunächst ein Feld für eine ASCII-Tabelle zur Laufzeit anlegt (malloc) und entsprechend füllt.
Danach soll die Tabelle im Bereich 32 bis 126 ausgegeben werden.

Tipp 1: Für malloc brauchen Sie #include<stdlib.h>.

Tipp 2: Bei einem char-Feld ascii und einer int-Zahl i wird bei der Zuweisung ascii = i; die Zahl i automatisch in ein char umgewandelt.

Tipp 3: Die printf-Formatkennung %c ist für Zeichen gedacht.

Mein Ansatz sieht wie folgt aus:
Ich bitte um Hilfestellung und bedanke mich im Voraus.

#include<Studio.h>
#include<stdlib.h>

int n = 95;
char *ascii;


int main()
{

ascii = malloc(sizeof(char)*n);

for(int i = 32; i < ascii.length; i++)
{
printf("%d %c ",i, ascii);
}
printf ("\n\n");
}
 

cwriter

Erfahrenes Mitglied
Hi

Wie du schon festgestellt hast, wird u.a. bei [i] vom Forum ein Befehl für Kursive Schrift erkannt. Mit den Codetags [code=c][/code] passiert das nicht und es sieht schöner aus :)

Zu deiner Frage:
Der Aufgabenstellung entnehme ich, dass man die gesamte Ascii-Tabelle erstellen soll. (Annahme: Echtes ASCII, nicht extended ASCII). Diese geht aber von 0 bis 127 und entsprechend sollte dein int n eher 128 sein.

Malloc sieht gut aus, auch wenn du noch auf den Rückgabewert prüfen solltest (malloc kann NULL zurückgeben).
ascii.length existiert nicht, in C sind diese Form der Arrays (eigentlich ein Pointer) grössenlos, bzw. sizeof(ascii) == sizeof(void*) == sizeof(T*), alle Pointer sind also gleich gross. Das hat den Hintergrund, dass du ja auch eine Referenz erstellen könntest:
C:
char c;
char* ascii = &c;
Hier hätte ascii ja gar keine Länge (gut, Länge 1, aber es widerspricht doch ein bisschen dem natürlichen Verständnis von Arrays).
In deinem Falle sollte aber n statt ascii.length gut funktionieren: Du weisst ja, dass du im malloc n chars bekommst. In C bewahrt man die Länge eines Pointers auf einen Array immer seperat auf.

Dann solltest du ascii auch noch korrekt befüllen, wie das geht, steht ja schon in der Aufgabenstellung.
Und die beste Range wäre, ohne ascii.length, halt einfach die angegebene Range 32-126, also
C:
for(int i = 32; i < 126; ++i)
Als letztes zum Printf:
%c ist der Spezifizierer für Argumente vom Typ "char", dein Argument ist aber vom Typ "char*".
Wieder kommen hier die Pointer ins Spiel, aber wenn ich dir sage, dass
C:
ascii[i] == *(ascii + i);
immer gilt (die linke Seite ist syntactic sugar für die rechte), dann müsste das eigentlich gehen, oder?
(Ich nehme an, dass ihr Referenzierung und Dereferenzierung schon gehabt habt).

Gruss
cwriter