【问题标题】:A function to read new line in c from a given stream从给定流中读取 c 中的新行的函数
【发布时间】:2020-06-04 19:50:31
【问题描述】:

我正在试验一个从给定文件中读取新行的 c 函数* 假设事先已经分配了指针。

#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;

}

在我的作业中使用它之前,我需要它是正确的,我只有一次机会。

您的意见对我很有价值。

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

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

【问题讨论】:

  • 代码无法在 C89 模式下编译,因为 if 语句在变量声明之前。
  • while((*string)[laenge-1]!='\n'); 是一个无限循环。真的,使用getline。你的函数有很多错误。你对realloc 的处理是错误的——在你free(*string) 之后你仍然使用*string = tmp 并取消引用它——那么它就是NULL!
  • 不要从malloc 投射返回。 stackoverflow.com/questions/605845/…

标签: c gcc c89


【解决方案1】:

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

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

【讨论】:

  • 所以这意味着我应该使用fgets 而不是fgetc 读取例如10个字符,并且只要它不返回Nullrealloc 的大小增加10?我会使用 scanf 和静态数组,但我的项目要求我从 .txt 文件和任意长度的标准输入中读取字符串。 :/ *在指针中哭泣*
  • @MouazTabboush 是的,差不多。
猜你喜欢
  • 2011-01-06
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多