记住字符串数组中的多个输出

时间:2018-05-15 16:00:44

标签: c arrays pipe

我需要获得有关character从父进程发送到child进程的时间的不同信息。每一秒我都会有一个array来存储收到特定字符的次数。

但是我的问题是我不知道如何将所有这些信息作为回复发送回管道回父进程。

我要做的是:

char caracter;
int number;

while((number = read(pipe1[0], &character, 1) > 0)) 
    stats[position] += number;  
close(pipe1[0]); 

现在我需要发送以下值:

stats[0]+stats[1]+stats[2]+stats[3]+stats[4],stats[0],stats[1],stats[2],stats[3],stats[4]

pipe2

我想通过以下方式发送:

write(pipe2[1], [stats values] ,strlen([stats values]));

我不知道如何记住单个array中的所有内容,然后能够分别打印字符被秒读取的次数。我必须提一下,我不可能事先知道这个数组会有多长。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

这里的一个想法是,如果你想要一个可以保存一些你不知道的值的数组,你可以使用一个简单的可扩展缓冲区实现。

这里,Buf是一个结构,它使用len和cap字段来确定缓冲区中剩余的空间量,然后才需要调用realloc并展开以添加更多空间

#include <stdio.h>
#include <stdlib.h>


// C dynamic buffer

//checks if buffer is full.
#define Buf_FULL(buf) (buf->len == buf->cap)

// Macro to expand buffer.
#define Buf_EXPAND(buf, amount) \
        buf->cap += amount; \
        buf = realloc(buf, sizeof(Buf) + buf->cap)


typedef struct
{
  size_t len;
  size_t cap;
  int data[0];
} Buf;

Buf* Buf_new(size_t capacity)
{
  Buf* newb = malloc(sizeof(Buf) + capacity);
  newb->len = 0;
  newb->cap = capacity;
  return newb;
}

void Buf_write(Buf* buf, int num)
{
  if(Buf_FULL(buf)) Buf_EXPAND(buf, 10);
  buf->data[buf->len++] = num;
}

int main(void)
{
  Buf* foo = Buf_new(10);
  Buf_write(foo, 50);
  Buf_write(foo, 10);
  return 0;
}

然后,您可以像访问普通数组一样通过访问b->data[i]来读取int值。字段int data[0];是一个虚拟指针,允许数组访问传递给malloc的任何大小。这意味着您可以使用堆内存来构建您选择的任何起始大小的数组。

注意:完成使用后,您还需要使用free释放缓冲区。