Символьный массив с динамической длиной - PullRequest
0 голосов
/ 08 апреля 2019

Я хотел написать программу на C, которая будет принимать строку любой длины от stdin и отображать ее или применять любую функцию к этой строке. Для этого мне понадобится строка (char []) с динамической длиной.

Вот как я это сделал:

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

int main(int argc, char **argv){


    char *line;
    line = malloc(10);
    line[0] = '\0';

    char *str = malloc(10);

    fprintf(stdout, "Please enter your line:\n");

    while(fgets(str, 10, stdin)){

        //check for line break
        if(str[strlen(str)-1] == '\n'){
            str[strlen(str) - 1] = '\0';
            strcat(line, str);
            break;
        }

        strcat(line, str);

        line = realloc(line, strlen(line) + 10);
        str = realloc(str, strlen(str) + 10);
    }

    fprintf(stderr, "you entered %s\n", line);

    //just for testing
    /*
    fprintf(stderr, "\n str= %s \n", str );
    fprintf(stderr, "\n line= %s \n", line);
    */

    free(line);
    free(str);
    exit(EXIT_SUCCESS);
}

Однако это выглядит ужасно. Мне нужны два набора символов. В char *str я запишу входные данные из stdin и соединю их с char *line. str будет содержать до 10 байт символов, и поэтому мне нужно объединить все до line.

Есть ли более чистый способ сохранить вывод из stdin в этом случае и применить к нему некоторую функцию? Я делаю это неправильно? Можно ли это сделать без malloc и realloc?

1 Ответ

1 голос
/ 08 апреля 2019

Это пример.Вам нужно добавить проверку результатов malloc & realloc (я не ради простоты)

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

#define CHUNK   32 

char *readline(void)
{
    size_t csize = CHUNK;
    size_t cpos = 0;
    char *str = malloc(CHUNK);
    int ch;
    while((ch = fgetc(stdin)) != '\n' && ch != '\r')
    {
        str[cpos++] = ch;
        if(cpos == csize)
        {
            csize += CHUNK;
            str = realloc(str, csize);
        }
    }
    str[cpos] = 0;
    return str;
}

int main()
{
    printf("\n%s\n", readline());

    return 0;
}

рабочий пример: https://onlinegdb.com/Sk9r4gOYV

Вы также должны освобождать выделенную память, когда ненужно больше.

...