В поисках идей по улучшению - PullRequest
1 голос
/ 31 октября 2010

gcc 4.4.4 c89

Есть ли лучший способ сделать это?

У меня есть следующий код для чтения из текстового файла. Текстовый файл содержит такие строки:

4 5 6 1 5 7 5 9 5 3 5 7 8 3 2 3 
7 2 3 4 5 3 7 9 3 2 5 6

Я привел пример только с 2 строками, но их может быть больше и каждая разной длины.

Что мне нужно сделать, так это записать числа в буфер, чтобы я мог их проанализировать. Что достаточно просто.

Однако я ищу решение, которое не будет перезаписывать буфер для каждой строки. Поэтому мой буфер результатов должен содержать следующее:

4 5 6 1 5 7 5 9 5 3 5 7 8 3 2 3 7 2 3 4 5 3 7 9 3 2 5 6

Поэтому я использую fgets для чтения в строках и передаю эту строку в свою функцию анализа.

Однако мне нужно, чтобы значение приращения в цикле for начиналось там, где заканчивался последний.

Я установил для device_buff значение static. Это безопасно? Я не заинтересован в использовании статической переменной внутри функции, так как они не являются поточно-ориентированными и представляют собой глобальную переменную.

int g_load_devices_numbers(void)
{
    fget(line_read, DEVICE_SIZE, fp) == NULL) {
        analyse_device_numbers(line_read);   
    }
}

static void analyse_device_numbers(const char * const device_line)
{
    size_t i = 0;
    static char device_buff[1024] = {0};
    static size_t device_counter = 0;
    /* Start inserting the last index */
    static size_t buff_counter = 0;

    /* copy each number into the char array
     * only copy up to the 'return' as fgets always inserts one */
    for(i = 0; device_line[i] != '\n'; i++, buff_counter++) {
        device_buff[buff_counter] = device_line[i];
        /* Only count numbers and not spaces */
        if(isspace(device_buff[buff_counter]) == 0) {
            device_counter++;
        }
    }

    /* nul terminate the vote buffer */
    device_buff[buff_counter] = '\0';

}

Большое спасибо за любые предложения,

1 Ответ

1 голос
/ 31 октября 2010

Нет, использование статического буфера для device_buff здесь небезопасно. Не из-за самого буфера, а потому, что он имеет ограниченный размер (1024 элемента), который не проверяется.

Было бы безопаснее предоставить в качестве входных параметров analyse_device_numbers буфер, в котором должны храниться данные, и длину этого буфера. Длина по-прежнему должна быть проверена, чтобы избежать записи после последней ячейки предоставленного буфера, и вам нужно выбрать какое-то соглашение об управлении ошибками (например, возвращая -1 из analyse_device_numbers, когда произошло переполнение буфера).

Всегда записывать в один и тот же целевой буфер обычный трюк, если переместить начало предоставленного буфера (с учетом уже сохраненных элементов) и уменьшить общую длину на ту же величину. Это можно сделать во внешнем цикле, который вызывает g_load_device_numbers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...