寻找改进的想法

时间:2010-10-31 10:05:51

标签: c

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

我只给出了两行示例,但可能会有更多,每个都有不同的长度。

我需要做的是将数字放入缓冲区,以便我可以对它们进行分析。这很容易。

但是,我正在寻找一种不会覆盖每一行缓冲区的解决方案。所以我的结果缓冲区应该包含以下内容:

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设置为静态。这样安全吗?我并不热衷于在函数内部使用静态变量,因为它们不是线程安全的并构成全局变量。

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 个答案:

答案 0 :(得分:1)

不,为device_buff使用静态缓冲区在这里并不安全。不是因为缓冲区本身,而是因为它的大小有限(1024项)未经检查。

将analyse_device_numbers作为输入参数提供给必须存储数据的缓冲区和缓冲区的长度会更安全。仍然必须检查长度,以避免在提供的缓冲区的最后一个单元格之后写入,并且您必须选择一些错误管理约定(例如,当发生缓冲区溢出时从analyzese_device_numbers返回-1)。

要始终在相同的目标缓冲区中写入通常的技巧,如果移动提供的缓冲区的开头(考虑已存储的项目)并通过相同的amout减少总长度。这可以在调用g_load_device_numbers的外部循环中完成。