Printf gibt kryptische Zeichen aus.
-
Moin, bin noch neu in der C Welt und habe heute ein sehr merkwürdiges Verhalten meines Listen-Testprogramms entdeckt.
Hier der Code:
#include <stdio.h> #include <string.h> #define NIL 0 typedef struct movie_str { char name[50]; } movie; typedef struct node_str { movie *data; struct node *next; } node, *nodeptr; typedef struct list_str { node *first, *last; } list, *listptr; list l; void initlist(listptr l); int isempty(list l); nodeptr newnode(movie *new_movie); void appendfirst(movie *new_movie, listptr l); int add(void); void showlist(void); void showlist(void) { nodeptr helpptr; helpptr = l.first; while (helpptr!=NIL) { printf("%d\n", helpptr->data->name); helpptr = helpptr->next; } } //warnung nr. 1 int add(void) { movie new_movie; int i; printf("Name:"); scanf("%s", &new_movie.name); rewind(stdin); appendfirst(&new_movie, &l); return 1; } int isempty(list l) { return (l.first == NIL && l.last == NIL); } void appendfirst(movie *new_movie, listptr l) { nodeptr np = newnode(new_movie); if(isempty(*l)) { l->first = np; l->last = np; } else { np->next = l->first; //warnung nr. 2 l->first = np; } } nodeptr newnode(movie *new_movie) { nodeptr np; np=(nodeptr)malloc(sizeof(movie)); np->data=new_movie; np->next=NIL; return np; } void initlist(list *l) { l->first = NIL; l->last = NIL; } int main(void) { char eingabe[50]; initlist(&l); while(1) { printf("\nBitte Befehl eingeben: "); scanf("%s", eingabe); rewind(stdin); if (strcmp(eingabe,"add")==0) { if (add()) printf("Erfolg.\n"); } if (strcmp(eingabe,"list")==0) showlist(); } return 0; }
Wenn ich nun erst ein paar Datensätze hinzufüge mit der Funktion add() und sie dann mit der Funktion list() anzeigen lasse, kriege ich nur kryptische Zeichen.
Außerdem kriege ich an zwei Stellen die Warnung "assignment from incompatible pointer type", und zwar an den beiden markierten Stellen.
Schonmal im Vorraus vielen Dank für eure Hilfe.
P.S.: Bin jeglicher Kritik gegenüber offen!
-
OK,
als erstens mal:
ich persönlich find deine Einrückung schrecklich Bspl.void appendfirst(movie *new_movie, listptr l) { nodeptr np = newnode(new_movie); if(isempty(*l)) { l->first = np; l->last = np; } else { np->next = l->first; //warnung nr. 2 l->first = np; } }
ich würds so machen:
void appendfirst(movie *new_movie, listptr l) { nodeptr np = newnode(new_movie); if(isempty(*l)) { l->first = np; l->last = np; } else { np->next = l->first; //warnung nr. 2 l->first = np; } }
Warum schreibste:
typedef struct node_str { movie *data; --> struct node *next; } node, *nodeptr;
struct node_str
Sollte funktioniern. Dann sollte auch die Warunung weg sein.
Und weiter gehst mit:
printf("%d\n", helpptr->data->name);
Weisst du überhaupt wie "printf" funktioniert!?
Das %d steht dafür daste ein numerischen Wert ausgeben willst, aberhelpptr->data->name
ist die Anfangsadresse eines Char-Arrays!
Müsstest also:printf("%s\n", helpptr->data->name);
schreiben.
Bei:
int add(void) { movie new_movie; int i; printf("Name:"); --> scanf("%s", &new_movie.name); rewind(stdin);
gibtse die Adresse eines Pointers an. Das macht auch keinen Sinn.
Einfach '&' weglassen.Und jetzt hab ich keine lust mehr.
Grüßli Pingu