我已经制作了(几乎)一个程序,它将完整的行打印到文件中(除非你输入);请看一下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void getline ( FILE *filep){
char c;int word = 100,lenmax=100;
char *line = (char *)malloc (100),*exline,*save = line;
printf("enter the data to be written press only enter at the end of the paragraph\n");
while(1){
c = fgetc ( stdin );
if ( --word != 0){
*line++ = c;
}
else{
word = 100;
exline = realloc(save ,lenmax += 100);
if (exline == NULL){
free ( line);
exit(1);
}
line = exline + (lenmax-100);
}
if ( (*line++=c)=='\n'){
*line = '\0';
break;
}
}
fprintf(filep,"%s",save);
free(line);
free(exline);
}
int main(){
FILE *fp;
fp = fopen("beauty.txt","w");
getline(fp);
return 1;
}
问题例如,如果你写“我在这里的世界”,在控制台它会像这样打印在文件上:
hheelloo wwoorrlldd ii aamm hheerree
表示每个角色两次。请弄清楚错误。我很困惑。还告诉我是否有必要释放两个指针line
和exline
?是不是只有这个
free(exline);//as exline is pointing to the complete buffer
答案 0 :(得分:2)
你先做
if ( --word != 0){
*line++ = c;
}
然后
if ( (*line++=c)=='\n'){
*line = '\0';
break;
}
将角色两次放入line
。
不要同时释放line
和exline
,因为当您realloc
时,line
不再有效。
此外,只要您保持低于100个字符,exline
可能根本不会被初始化。
最后,在读取字符时修改line
,因此它无论如何都不是有效的堆指针。您可以保存变量save
,只需使用exline
即可。所以正确的方法可能是
char *line = malloc (100), *exline = line;
/* ... */
save = exline;
exline = realloc(save, lenmax += 100);
if (exline == NULL) {
free(save);
/* ... */
free(exline);
这还可以修复超过前100个字符的其他realloc
。