每次附加将数据填充到缓冲区的功能

时间:2018-07-12 12:35:50

标签: c embedded

我不确定如何在不使用全局变量的情况下将数据填充到缓冲区追加中。

int main(){
    char buffer[100];
    for(int i = 0; i<10; i++){
        write_to_buffer(buffer);
    }
}

void write_to_buffer(char* buffer){
    char* p = buffer;

    p += sprintf(p, "%f,", version);
}

每次调用该函数时,这样的事情都会覆盖缓冲区。 如何使用指针进行跟踪?或其他任何好的解决方案的想法?

2 个答案:

答案 0 :(得分:0)

您需要从当前长度开始填充缓冲区。

int main(){
    char buffer[100] = ""; // start with an empty string, so strlen(buffer) returns 0
    for (int i = 0; i < 10; i++){
        write_to_buffer(buffer);
    }
}

void write_to_buffer(char* buffer){
    sprintf(&buffer[strlen(buffer)], "%f,", version);
}

但是,对于cpu不太快的嵌入式编程,我肯定会传递缓冲区电流和最大长度作为参数,并返回附加字符数:

int main() {
    char buffer[100];
    const size_t buffer_size = sizeof(buffer)/sizeof(buffer[0]);
    size_t buffer_pos = 0;
    for (int i = 0; i < 10; i++){
        buffer_pos += write_to_buffer(&buffer[buffer_pos], buffer_size - buffer_pos);
    }
}

size_t write_to_buffer(char* buffer, size_t size){
    return snprintf(buffer, size, "%f,", version);
}

或使用指针,但是我更喜欢用size_t而不是结束指针来表示范围:

int main() {
    char buffer[100];
    char *pnt = buffer;
    for (int i = 0; i < 10; i++){
        pnt = write_to_buffer(pnt);
    }
    const size_t buffer_len = pnt - buffer;
}

char* write_to_buffer(char* buffer) {
    return buffer + sprintf(buffer, "%f,", version);
}

答案 1 :(得分:-1)

这是完成这项工作的简单有效的方法。使用这样的静态关键字

    int main(){
        char buffer[100];
        for(int i = 0; i<10; i++){
        write_to_buffer(buffer);
        }
    }

    void write_to_buffer(char* buffer){
        static pos=0;
        char* p = &buffer[pos];
        sprintf(p, "%f,", version);
        pos+=1;
    }