每次追加数据到缓冲区的函数

问题描述 投票:0回答:3

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

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);
}

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

c embedded
3个回答
2
投票

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

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);
}

0
投票

应该有效:

  int i = 0;
  char main_buffer [100];
  while (i < 10) {
    char buffer[] = "abc";
    strcat(main_buffer, buffer); // concatenate
    i ++;
  }

-1
投票

这是一个简单而有效的方法来完成这项工作。像这样使用 static 关键字

    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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.