Programmierhilfe für Studium gesucht - C
-
Hi Leute,
ich bin nicht so der Programmierer (wie sonst auch alle in meinem Studium), deshalb brauche ich Hilfe:
Da ich bis Freitag etwas in c programmieren muss, brauche ich jemanden, der mir vllt sogar das Programm schreibt oder zumindest mal den Anfang machen kann.
Wir haben in meinem Studium alle ziemlichen Zeitdruck und den schlechtesten prof der Welt.
Über Hilfe wäre ich sehr dankbar.
Aufgabe 1
Schreiben Sie ein Modul, welches einen Datentyp string implementiert. Ein String soll intern
als struct implementiert sein, der den String selbst sowie dessen aktuelle Länge speichert.
Implementieren Sie Funktionen, welche Strings initialisieren, kopieren und aneinander hängen
können sowie eine Funktion zum Ausdrucken eines Strings.
Die Strings sollen dynamisch verwaltet werden und Platz soll bei Bedarf von den String-
Funktionen allokiert und de-allokiert werden. Achten Sie darauf, dass kein Platz verloren geht!Hinweis: Verwenden Sie folgende Typdefinitionen und Prototypen:
typedef struct {
int len; /* Anzahl der Zeichen in s; -1 wenn s == NULL /
char *s; /* ein C-string mit abschließendem \0-Zeichen /
} string_t;
typedef string_t string;
void set (string s1, char *s); /* initialisiere s1 mit s /
void copy (string s1, string s2); /* kopiere s2 nach s1 /
void concat (string s1, string s2); /* hänge s2 an s1 an /
void print (string s1); / drucke s1 aus */Testen Sie Ihre Funktionen ausgiebig mit einem entsprechenden Hauptprogramm und
verwahren Sie dieses Programm für die Testatprüfung!
-
Woran hängst du denn?
-
Das Problem ist, dass ich sonst wenigstens wusste, was das Programm erfüllen soll (zB Flächenberechnung, Datumausgabe, etc).
Hier ist das bei mir nicht der Fall.
Und mit der Vorgabe unseres Profs kann ich auch nicht wirklich etwas anfangen.
Seit Tagen versuche ich irgendetwas zu programmieren, aber weiß nicht wo ich rauskommen soll (Und funktioniert hat auch nichts :D)
-
Paul_McIcetea schrieb:
Da ich bis Freitag etwas in c programmieren muss, brauche ich jemanden, der mir [...] zumindest mal den Anfang machen kann.
Als Anfang hast Du ja zwei Vorgaben für den leeren String in der Aufgabe stehen.
Fang doch damit an.Z.B. in dem Du hier Deine Computermagie einsetzt:
#include <stdlib.h> #include <assert.h> typedef struct { int len; /* Anzahl der Zeichen in s; -1 wenn s == NULL */ char *s; /* ein C-string mit abschließendem \0-Zeichen (oder NULL) */ } string_t; typedef string_t* string; int main(){ string s; // Dein Code assert(s->len==-1); assert(s->s==NULL); }
-
Die Aufgabenstellung ist eigentlich völlig klar. Was verstehst du daran nicht?
-
Es fehlt übrigens eine Freigabefunktion, damit man die (normalerweise implizite) Anforderung "Achten Sie darauf, dass kein Platz verloren geht!" umsetzen kann. Ich schlage
void release(string s);
vor.
-
Bashar schrieb:
Ich schlage
void release(string s);
vor.Ein
set(s, NULL);
sollte auch gehen
-
Oh, stimmt.
-
Muss ich nicht vor dem int main () folgendes programmieren?
void set (string* s1, char *s); /* initialisiere s1 mit s /
void copy (string s1, string s2); /* kopiere s2 nach s1 /
void concat (string s1, string s2); /* hänge s2 an s1 an /
void print (string s1); / drucke s1 aus */Und wenn ich zum beispiel das void set (...) machen will... Wie initialiesiere ich denn s1 mit s?
Muss ich da erst die Länge vom string festlegen und den pointer auf den Anfang draufsetzen???
-
Paul_McIcetea schrieb:
Muss ich nicht vor dem int main () folgendes programmieren?
"Muss" nicht, aber eine sinnvolle Möglichkeit ist es schon.
Und wenn ich zum beispiel das void set (...) machen will... Wie initialiesiere ich denn s1 mit s?
Du schaust wie lang s ist, dann besorgst du ausreichend Speicher (
malloc) und kopierst den Inhalt von s dort rein.
-
Verdammt!
Die bekloppten Vorgaben machen das nicht so trivial, wie es anfangs aussieht.Ich würde die Vorgabe len==-1, wenn str==NULL kippen. Handelt man sich nur Ärger mit ein.
-
...oder man nimmt sich doch eine
string_alloc()
und einestring_free()
Funktion hinzu.
Vielleicht das Beste...
-
Bashar schrieb:
Du schaust wie lang s ist, dann besorgst du ausreichend Speicher (
malloc) und kopierst den Inhalt von s dort rein.
kann ich das so oder wenigstens so ähnlich machen?
int laenge=strlen(s); //länge von s
s1=(string*) malloc(sizeof(string_t));
strcpy(s,s1); //kopiere s in s1
-
Das Ergebnis von malloc braucht man nicht casten.
sizeof(string_t) ist nicht das, was du willst. Du willst so viel Speicher, dass s reinpasst. Also, eben so viel wie dir strlen zurückgegeben hat, plus 1 für '\0' am Ende.
-
Paul_McIcetea schrieb:
int laenge=strlen(s); //länge von s
s1=(string*) malloc(sizeof(string_t));
strcpy(s,s1); //kopiere s in s1Bitte poste genügend Kontext dazu, dass man die Typen der Variablen usw. erkennen kann. Ist s1 ein string, ein string*, oder ein char*?
-
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>typedef struct {
int len; /* Anzahl der Zeichen in s; -1 wenn s == NULL */
char *s; /* ein C-string mit abschließendem \0-Zeichen */
} string_t;typedef string_t* string;
void set (string* s1, char *s) /* initialisiere s1 mit s */
{int laenge=strlen(s); //länge von s
s1=(string*) malloc(sizeof(laenge));
strcpy(s,s1);
}
soweit wäre ich jetzt... s1 wäre dann also ein string* (vorgegeben)Mechanics schrieb:
sizeof(string_t) ist nicht das, was du willst. Du willst so viel Speicher, dass s reinpasst. Also, eben so viel wie dir strlen zurückgegeben hat, plus 1 für '\0' am Ende.
wäre das dann so besser?
s1=(string*) malloc(sizeof(laenge));
-
int laenge=strlen(s); //länge von s s1=(string*) malloc(sizeof(string_t)); // du brauchst keinen Platz für string_t sondern für s. Die Laenge hast du gerade fast bestimmt. strcpy(s,s1); // Beachte die Reihenfolge bei strcpy ²
Bei
strcpy(z,q)
soll das so aussehen, als ob manz = q
schreibt.
-
Paul_McIcetea schrieb:
void set (string* s1, char *s) /* initialisiere s1 mit s */ { int laenge=strlen(s); //länge von s s1=(string*) malloc(sizeof(laenge)); strcpy(s,s1); }
soweit wäre ich jetzt... s1 wäre dann also ein string* (vorgegeben)
OK. Mechanics hat schon die malloc-Zeile kritisiert.
Ein paar Sachen: 1) Du solltest nochmal nachlesen, welches Argument bei strcpy die Quelle und welche das Ziel ist.
2) Du tust so, als wäre s1 ein char-Zeiger. Völliger Unsinn, s1 zeigt auf einenstring
(was auch wieder ein Zeiger aufstruct string_t
ist). Du kannst da nicht einfach irgendwelches Zeug reinkopieren. Das Ziel deiner Kopieraktion ist das Element(*s1)->s
.Mechanics schrieb:
wäre das dann so besser?
s1=(string*) malloc(sizeof(laenge));Das +1 für das Nullbyte am Ende fehlt immernoch. Außerdem (siehe oben) ist es falsch, das ganze an s1 zuzuweisen. Und mach den Cast weg.
edit: thx an furble wurble, habs korrigiert.
BTW, warum wird an set und die anderen Funktionen eigentlich einstring
-Zeiger übergeben? Das scheint mir nicht sonderlich sinnvoll zu sein.
-
Bashar schrieb:
s1 zeigt auf eine gegebene Struktur vom Typ
struct string_t
.s1
ist sogarstring_t**
-
sizeof
liefert dir Größe (den Speicherverbrauch) in Bytes von einer Variablen.laenge ist vom Typ
int
und das sind i.A. 16 - 32 Bit also 2 - 4 Byte
Du brauchst den Wert von laengeFalls du auf dumme Gedanken kommst:
s ist ein Zeiger und die sind z.B. auf 32-Bit Systemen auch 4 Byte groß.
Das hat nichts mit der Länge des Textes zu tun, auf die s zeigt.