繁体   English   中英

从未知长度的文件中读取字符串的函数

[英]Function that reads a string from a file of unknown length

我一直在尝试拼凑一个函数,该函数允许我从未知长度的给定文件中创建一个字符串。

应该做的是将输出字符串的大小设置为单个字符,然后对于除 EOF 之外的每个字符,将字符串的大小增加 1 并将新读取的字符添加到其中。

void readstring(FILE *f, char *s[])
{
    int size = 1;
    int c = 0, i = 0;

    s = malloc(size*sizeof(char));

    while(c != -1)
    {
        c = fgetc(f);
        s[i] = (char)c;
        i++;

        if(i == size)
        {
            size++;
            s = realloc(s, size*sizeof(char));
        }
    }

    s[i] = '\0';
}

int main()
{
    char *in = malloc(2*sizeof(char));
    FILE *IN;

    IN = fopen("in.txt", "r");

    readstring(IN, in);

    printf("%s",&in);

    fclose(IN);
    free(in);

    return 0;
}

如果您使用的是 POSIX 兼容系统(任何现代 Linux),请不要尝试重新发明轮子。 只需使用getline() 它将为您管理不断增长的缓冲区,并返回一个合适的malloc()字符串。


您将malloc() / realloc()的结果分配给s而不是*s sreadstring()完全是本地的, *ss指向的指针变量。 在main中传入指针的地址 正确的代码如下所示:

void foo(char** out_string) {
    *out_string = malloc(...);
}

int main() {
    char* string;
    foo(&string);
}

如果没有采用&和指针解引用*的地址,您的main()就无法知道readstring()在哪里存储了字符。

当您设置字符串的字符时,您还需要取消引用双指针:使用(*s)[i]而不是s[i] ,因为s[i]表示一个指针,而不是一个字符。


此外,尝试使用valgrind运行您的程序,看看您是否可以从它向您发出的错误中学习。 它是调试内存相关问题的好工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM