C fgets没有获得全文

时间:2013-03-09 16:04:05

标签: c char fgets

当我使用此代码时

char *openFile(const char file[1024]){
FILE *f = fopen(file, "r");
char c[1000];
char *d;
if (f!=NULL) {
    if (fgets(c, 1000, f) !=NULL){
        d = c;
    }
    else{
        d = "No text";
    }
}
else{
    d="error";
    printf("%s", d);
}
fclose(f);

return d;
}

例如,获取这个长文本

fosndjfnsondfnsnkdfsjndfoweoingfoweljksdnflwkengdfwoensldkfwejlnfkdlskdfnlskdnflskdnflksndlfknslkdnflkndlknfslnlfjnlksdnjfnjwnejnfwenfnjwenlfodnakdoifnkleroglknerolkdfgnrkldsfgnlskdfgnlksdfglndlfkngkldnslkgnlkfdnkglnklsndfklnglfdlskgknllkdglksdfkkngkresoirigknlsdf

(这个文字没有任何意义,它只是一个测试)我返回char *d;它输出这个

fosndjfnsondfnsnkdfsjndfoweoingfoweljksdnflwkengdfwoensldkfwejlnfkdlskdfnlskdnflskdnflksndlfknslkdnflkndlknfslnlfjnlksdnjfnjwnejnfwenfnjwenlfodnakdoifnkleroglknerolkdfgnrkldsfgnlskdfgnlksdfglndlfkngkldnslkgnlkfdnkglnklsndfklnglfdlskgknllkdglksdfkkngkresoir¯ˇˇˇˇˇˇˇv”[

为什么最后会出现那些奇怪的角色?

1 个答案:

答案 0 :(得分:3)

您已在c中将openFile定义为本地变量。假设您的阅读成功,您将在d中返回其地址。它在openFile结束时被销毁,因此d变成了悬空指针。在openFile返回后尝试使用它会导致未定义的行为。

可能的治疗方法包括将c定义为static,然后返回分配了malloc的缓冲区。将c定义为static会有相当多的陷阱,特别是当涉及到多线程时,因此动态分配通常会更加清晰。