Как читать неограниченное количество символов в C - PullRequest
5 голосов
/ 24 марта 2010

Как прочитать неограниченное количество символов в переменной char* без указания размера?

Например, скажем, я хочу прочитать адрес сотрудника, который также может занимать несколько строк.

Ответы [ 3 ]

8 голосов
/ 24 марта 2010

Вы должны начать с «угадывания» ожидаемого размера, а затем выделить такой большой буфер, используя malloc. Если это окажется слишком маленьким, вы используете realloc, чтобы изменить размер буфера, чтобы он стал немного больше. Пример кода:

char *buffer;
size_t num_read;
size_t buffer_size;

buffer_size = 100;
buffer = malloc(buffer_size);
num_read = 0;

while (!finished_reading()) {
    char c = getchar();
    if (num_read >= buffer_size) {
        char *new_buffer;

        buffer_size *= 2; // try a buffer that's twice as big as before
        new_buffer = realloc(buffer, buffer_size);
        if (new_buffer == NULL) {
            free(buffer);
            /* Abort - out of memory */
        }

        buffer = new_buffer;
    }
    buffer[num_read] = c;
    num_read++;
}

Это просто не в моей голове, и может (читай: вероятно) содержать ошибки, но должно дать вам хорошее представление.

1 голос
/ 14 сентября 2012

Просто нужно было ответить на Ex7.1, стр. 330 Beginning C, Айвор Хортон, 3-е издание Потребовалось пару недель, чтобы потренироваться. Позволяет вводить плавающие числа без указания заранее, сколько чисел введет пользователь. Сохраняет числа в динамическом массиве, а затем распечатывает числа и среднее значение. Использование Code :: Blocks с Ubuntu 11.04. Надеюсь, это поможет.

/*realloc_for_averaging_value_of_floats_fri14Sept2012_16:30  */

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1

int main(int argc, char ** argv[])
{
    float input = 0;
    int count=0, n = 0;
    float *numbers = NULL;
    float *more_numbers;
    float sum = 0.0;

    while (TRUE)
    {
        do
        {
            printf("Enter an floating point value (0 to end): ");
            scanf("%f", &input);
            count++;
            more_numbers = (float*) realloc(numbers, count * sizeof(float));
            if ( more_numbers != NULL )
            {
                numbers = more_numbers;
                numbers[count - 1] = input;
            }
            else
            {
                free(numbers);
                puts("Error (re)allocating memory");
                exit(TRUE);
            }
        } while ( input != 0 );

        printf("Numbers entered: ");
        while( n < count )
        {
            printf("%f ", numbers[n]);  /* n is always less than count.*/
            n++;
        }
        /*need n++ otherwise loops forever*/
        n = 0;
        while( n < count )
        {
            sum += numbers[n];      /*Add numbers together*/
            n++;
        }
        /* Divide sum / count = average.*/
        printf("\n Average of floats = %f \n", sum / (count - 1));
    }
    return 0;
}

/* Success Fri Sept 14 13:29 . That was hard work.*/
/* Always looks simple when working.*/
/* Next step is to use a function to work out the average.*/
/*Anonymous on July 04, 2012*/
/* http://www.careercup.com/question?id=14193663 */
0 голосов
/ 24 марта 2010

Как насчет того, чтобы поместить в стек буфер размером 1 КБ (или 4 КБ), считывая его до тех пор, пока не найдете конец адреса, а затем выделить буфер правильного размера и скопировать в него данные? Как только вы вернетесь из функции, буфер стека исчезнет, ​​и у вас будет только один вызов malloc.

...