首页 > 解决方案 > 从给定流中读取 c 中的新行的函数

问题描述

我正在尝试从给定的 FILE* 读取新行的 ac 函数让我们假设事先已经分配了指针。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



int getLine(char** string, FILE* stream);
int main(){
    char* a = (char*) malloc(10);
    getLine(&a, stdin);
    printf("%s\n", a);
    free(a);
    return 0;
}

int getLine(char** string, FILE* stream){
    char* tmp;
    unsigned laenge=0u;
    if (strlen(*string)>0)
    {   
        free(*string);
        *string = (char *) malloc(sizeof(char));
    }
    do
    {
        tmp=(char *)realloc(*string,++laenge);  
        if(tmp==NULL)
        {
            printf("Allokation fehlgeschlagen\n");
            free(*string);
        }
        *string=tmp;
        (*string)[laenge-1]=fgetc(stream);
        if (feof(stream))
        {   
            (*string)[laenge-1]='\0';
            return EOF;
        }
    }
    while((*string)[laenge-1]!='\n');
    (*string)[laenge-1]='\0';
    return laenge;

}

在我在作业中使用它之前,我需要它是正确的,我只有一次机会。<(^.^')v

你的意见对我很有价值。

  1. 在这种情况下会发生任何内存泄漏吗?
  2. 使用这样的功能是一个好习惯吗?
  3. 我错过了什么吗?

如果这可能有帮助,我必须坚持 C89 标准,并且我正在使用gcc -ansi -pedantic -Wall它来编译我的代码

标签: cgccc89

解决方案


我建议使用fgets而不是尝试编写自己的函数来从FILE指针读取行,因为fgets将最多n字符读取到缓冲区字符串中并在遇到换行符时停止读取。

但是,如果对于您的项目,需要从FILE指针读取任意长度的整行,我建议您使用realloc来增大缓冲区并读取fgets如此分配的额外空间,直到缓冲区未满。


推荐阅读