c - 动态地从文件或标准输入中读取一行

标签 c memory-management dynamic memory-leaks malloc

我面临的情况是,除了处理更多的输入之外,我的函数完全按照我想要的方式执行。

我最初想逐个处理每个字符,但遇到了问题。因此,fscanf 不仅可以完成我想要它做的事情,而且对于仅读取一行也至关重要。我注意到,我无法通过这种方式为更大的数组重新分配空间。我已经尝试使用格式说明符,即 %*s 来预先包含特定数量的缓冲区空间,但这仍然不起作用。

我还注意到,我无法知道我正在读取的字符串的大小。

这是我的尝试和想法:

#define LINE_MAX 1000

char* getline(FILE* inputStream)
{
    int capacity = LINE_MAX;
    char* line = malloc(capacity * sizeof(char));
    int ch;

    /* if (sizeof(capacity) == sizeof(line)) { // Not a valid comparison? Too late?
        capacity *= 2;
        line = realloc(line, capacity * sizeof(line));
    } */

    if (fscanf(stream, "%[^\n]s", line) == 1) {
        ch = fgetc(inputStream);
        if (ch != '\n' && ch != EOF) {
            fscanf(inputStream, "%*[^\n]");
            fscanf(inputStream, "%*c");
        }
        free(line);
        return line;
    }
    free(line);
    return NULL;
}

总的来说,我对内存分配很陌生,但我觉得我很清楚在这里要做什么。事实证明我错了。

最佳答案

这是读取一行并将其存储在字符数组中的示例。

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

int main(void) {
    signed char *str;
    int c;
    int i;
    int size = 10;
    str = malloc(size*sizeof(char));
    for(i=0;(c=getchar()) !='\n' && c != EOF;++i){
        if( i == size){
            size = 2*size;
            str = realloc(str, size*sizeof(char));
            if(str == NULL){
                printf("Error Unable to Grow String! :(");
                exit(-1);
            }
        } 
        str[i] = c;
    }
    if(i == size){
        str = realloc(str, (size+1)*sizeof(char));
        if(str == NULL){
            printf("Error Unable to Grow String! :(");
            exit(-1);
        }

    }
    str[i] = '\0';
    printf("My String : %s", str);
    return 0;
}

如果当前数组无法容纳从输入读取的字符,则数组大小将调整为原始大小的两倍。

关于c - 动态地从文件或标准输入中读取一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46940151/

相关文章:

php - 在 PHP 扩展中,有没有办法为 PHP 脚本中的每个方法调用获取回调?

c - 从 Motif 中的 BulletinBoard 小部件中删除关闭按钮

ios - 在 [[NSString alloc] init] 之后发送 release 导致 EXIT_BAD_ACCESS

memory-management - Linux 内存管理

php - 动态显示带有相应标题的表格

c - `int` 类型大小 int C

c - 创建线程时出错。警告 : passing argument 3 of ‘pthread_create’ from incompatible pointer type

没有指针的 C++ 多态性

c# - System.Dynamic 错误?

C++ Local var in dynamic, on stack?