从文件或stdin中动态读取一行

时间:2017-10-25 19:00:26

标签: 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;
}

我对内存分配一般不熟悉,但我觉得我好好知道该怎么做。事实证明我错了。

1 个答案:

答案 0 :(得分:0)

以下是读取一行并将其存储在Character数组中的示例。

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

如果当前数组不能保存从输入中读取的字符,则将数组的大小调整为其原始大小的两倍。