pointer behaelt/erinnert sich an string?!
-
Hallo,
ich habe folgenden Codechar* getline(FILE *handle) { char *line; char zeichen; line = NULL; zeichen = fgetc(handle); if(zeichen == '\n') { line = malloc(sizeof(char)*2); strncpy(line,&zeichen,1); return line; } if(zeichen == EOF) { return NULL; } line = malloc(sizeof(char)*2); strncpy(line,&zeichen,1); do { zeichen = fgetc(handle); if(zeichen == '\n') { line = realloc(line, strlen(line)+2); strncat(line,&zeichen,1); break; } if(zeichen == EOF) break; line = realloc(line,strlen(line)+2); strncat(line,&zeichen,1); } while(1); return line; } #include <stdio.h> #include <stdlib.h> #include "functions.h" int main() { FILE *h; char *b; b = NULL; h = NULL; h = fopen("test1.txt","r"); while(NULL != (b = getline(h))) { printf("%s",b); free(b); b = NULL; } printf("Ende\n"); fclose(h); h = NULL; if(b != NULL) free(b); return 0; }
wenn ich das jetzt auf der datei ausfuehre, die folgenden inhalt hat.
bla hier ist nardi
adsfaf(letzte zeile ist ein reines enter)
kommt folgendes raus:bla hier ist nardi
adsfafdsfaf
Ich bin vollkommen ratlos, warum das so ist. ich bin es mit dem Debugger durchgegangen und hab ja extra jedem zeiger wieder den nullpointer zugewiesen,
aber trotzdem wiederholt er das eine. Kann mir das jemand erklaeren?Danke
-
Ich hab nicht alles gelesen, hab nur untersucht, was du mit leeren Zeilen umgehst, also die erste if Anweisung deiner Funktion, wo du strncpy benutzt.
[quote man strncpy]
The strncpy() function is similar, except that not more than n bytes of src are copied. Thus, if there is no null
byte among the first n bytes of src, the result will not be null-terminated.
[/quote]Dein string ist nicht null-terminierend. Mach besser so:
if(zeichen == '\n') { line = malloc(sizeof(char)*2); line[0]=zeichen; line[1]=0; return line; }
Ob das daran liegt, weiß ich noch nicht, aber das ist mir auf jeden Fall aufgefallen.
Ich würde auch an deiner Stelle fgets benutzen. Jedenfalls solltest du 0-terminierende strings mit strncpy benutzen und line 0-terminierend machen.
-
wow. das war es wirklich. Aber warum schliesst strncpy nichts mit einem null-terminierenden byte ab? das ist ja schrecklich
und falls jemand noch was weiss, was ich übersehen haben sollte, herdamit
-
the_menace schrieb:
wow. das war es wirklich. Aber warum schliesst strncpy nichts mit einem null-terminierenden byte ab? das ist ja schrecklich
und falls jemand noch was weiss, was ich übersehen haben sollte, herdamit
das musst du den Leuten von der ANSI Komision fragen. strncopy kümmert sich nur drum n Zeichen zu kopieren, und \0 muss nicht dabei sein.