Datei einlesen
-
Das Programm funktioniert soweit und ich habe es auch in der Form verstanden, danke! Aber jetzt wollte ich das doch nochmal mit einem Zeiger probieren und nun stehe ich wieder auf dem Schlauch.
Habe es zuerst ohne Funktion geschrieben und das funktioniert einwandfrei.
#include <stdio.h> #include <stdlib.h> int main() { char *wort[200][200]; int i=0; FILE* fp; fp=fopen("gedicht.txt", "r"); while(!feof(fp)) { fscanf(fp, "%s", &wort[i]); i++; } printf("Das Wort lautet: '%s'\n", wort[5-1]); system("PAUSE"); return 0; }
Dann wollte ich dieses in eine Funktion mit reinpacken und nun funktioniert es doch wieder nicht, "return makes integer from pointer without a cast" (??).
Da fehlt mir dann wohl doch noch die Erfahrung.#include <stdio.h> #include <stdlib.h> char wort(char* filename, int nummer); int main() { printf("Das Wort lautet: '%s'\n", wort("gedicht.txt", 5)); system("PAUSE"); return 0; } char wort(char* filename, int nummer) { FILE *fp; fp=fopen(filename, "r"); char *zeiger[200][200]; int i=0; while(!feof(fp)) { fscanf(fp, "%s", &zeiger[i]); i++; } return zeiger[nummer-1]; }
Wäre super, wenn ihr mir nochmal helfen könntet und die Abänderung von dem Programm verraten würdet
-
Danke, hat sich jetzt doch erledigt! War wohl nur ein "*" vor "Wort"...
-
ähmmmmmmm....
zufall dass es geht:
der speicher für das array "zeiger" wurde nicht mit malloc angelegt. Es sollte daher der Speicher nach aufruf der Funktion freigegeben werden, was unter bestimmten Umständen dazu führt, dass die anschliessende Ausgabe nicht funktioniert.WO IST DAS FCLOSE?!?!?!?!
und schon mal was von "fgets" gehört?mfG (c)h
-
Ok, wenn ich aber malloc verwende, funktioniert das nicht auf Anhieb, habe jetzt mal ein kleines Prog zum Üben geschrieben, aber irgendwie will das nicht den Zeiger[1] anzeigen(???).
#include <stdio.h> #include <stdlib.h> int main() { char* zeiger; zeiger=(char*)malloc(sizeof(char)*3); zeiger[0]="abcd"; zeiger[1]="efghi"; zeiger[2]="jklmnopqr"; printf("%s\n", zeiger[1]); system("PAUSE"); return 0; }
-
Neuling00 schrieb:
Ok, wenn ich aber malloc verwende, funktioniert das nicht auf Anhieb, habe jetzt mal ein kleines Prog zum Üben geschrieben, aber irgendwie will das nicht den Zeiger[1] anzeigen(???).
#include <stdio.h> #include <stdlib.h> int main() { char* zeiger; zeiger=(char*)malloc(sizeof(char)*3); zeiger[0]="abcd"; zeiger[1]="efghi"; zeiger[2]="jklmnopqr"; printf("%s\n", zeiger[1]); system("PAUSE"); return 0; }
char zeiger ist ein eindimensionales array, wenn d es mit "zeiger[1]" ansprichst, sprichst du ein einzelnes char an.
du versuchst nun auf ein "char" ein "char[5]" zu speichern, was nicht funktionieren kann, weil das "char" nur 3 Elemente beeinhaltet "malloc(3)".
weiters kann man nicht einfach einen String mit
str1="hallo";
belegen, sondern man muss "strcpy" verwenden. Dh:
strcpy(zeiger,"asdf");
malloc.h fehlt
mein vorschlag:#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> int main() { char* zeiger; zeiger=(char*)malloc(8); // sizeof(char) = 1, 8 weil maximal 8 byte benötigt werden strcpy(zeiger,"abcd"); strcpy(zeiger,"efghi"); strcpy(zeiger,"jklmnop"); // belegung nur mit strcpy, größe 7 zeichen + \0 = 8byte --> malloc(8); printf("%s\n", zeiger); // ohne index, weil 1-dim free(zeiger); // free nicht vergessen! speicher wird freigegeben getch(); // bzw. getchar ,vergleichbar mit system("pause"); return 0; }
mfG (c)h
-
...wenn ich das Programm jetzt so laufen lasse, dann funktioniert es, zeigt jedoch nur "jklmnop" an, also quasi den letzten Eintrag bzw. den "letzten Zeiger". Was aber, wenn ich jetzt auf den ersten oder den zweiten zugreifen möchte (weil ich ja keinen Index angeben darf)?
-
dann musst du ein array deklarieren:
char *(zeiger[3]); // 3 pointer auf char zeiger[0]=(char*)malloc(5); // allocieren zeiger[1]=(char*)malloc(6); zeiger[2]=(char*)malloc(5); strcpy(zeiger[0],"asdf"); // belegen strcpy(zeiger[1],"hallo"); strcpy(zeiger[2],"test"); printf("\n%s",zeiger[0]); // ausgeben printf("\n%s",zeiger[1]); printf("\n%s",zeiger[2]);
-
und..
free(zeiger[0]); free(zeiger[1]); free(zeiger[2]);
nicht vergessen
-
Super, danke!!! Jetzt hab ichs glaub verstanden!
Werd ich gleich mal ausprobieren.
-
@Neuling
Bitte verwende nicht system("PAUSE"), das ist die aller schlechteste Methode, um eine beliebige Eingabe vom Benutzer zu verlangen. chille07 hat in seinem Code schon gezeigt, wie man es besser machen kann (-> getch()). Ansonsten gibts zu dem Thema noch einen Thread in der Konsolen-FAQ unter "Automatisches Schließen verhindern".