我对C没有多少经验。
我有一个小型C程序连接到几乎无限的文本流(25Mb / s)。
我想将字符串的每一行作为单独的消息发送给zeromq。
因此,我将每秒发送数千条消息,并且在发送每条消息之前,我想操纵通过套接字发送的字符串:
说我开始:
XXX Quote <1>A<2>B<3>C
我想要
main
从一般意义上讲,我怎样才能安全地做到这一点,以免我遇到内存泄漏?我会有类似的东西(举个例子,#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* parse(const char* input) {
char* output;
char* input_copy = strdup(input);
char* token;
char* first;
char* third;
char* fourth;
token = strtok(input_copy, " ");
first = token;
for (int i = 0; i < 3; i++)
{
token = strtok(NULL, " ");
if (i == 1) third = token;
if (i == 2) fourth = token;
}
asprintf(&output, "%s %s %s", third, first, fourth);
return output;
free(output);
}
int main(void)
{
const char *a = "Quote {0.0.0.0} XXX <1>A<2>B<3>C";
//SEND_MESSAGE(parse(a));
return 0;
}
函数实际上是一个带有不同字符的永无止境的循环):
allname = []
alltel = []
allemail = []
for link in docdetail:
name = soup.h1.contents[1]
tel = soup.find('a', class_='tel').string
email = soup.find('a', class_='email').string
allname.append(name)
alltel.append(tel)
allemail.append(email)
这会有用吗?
答案 0 :(得分:2)
如果您知道(或可以特别确定)每个first
,second
,third
和fourth
的最大尺寸,您可以消除所有可能性通过简单地为每个使用固定大小的缓冲区来记录内存泄漏。你说你的25M /秒文本被分解为行,所以你可能正在使用一个面向行的输入函数(例如fgets
或{{ 1}})从流中读取。在这种情况下,您也可以使用最大行长度(X4)来确保您的固定缓冲区足够。
您使用getline
作为分隔符,正在标记为first
,second
,third
和fourth
,为什么不使用{{1} }?如果要使用space
函数,只需将缓冲区作为参数传递。
如果您可以确定最大值并且您在sscanf
上进行标记,则可以执行以下操作:
parse
(例如,仅使用space
,根据需要将结果传递给 zeromq )
示例使用/输出
#include <stdio.h>
#define MAXC 1024
int main(void)
{
const char *a = "Quote {0.0.0.0} XXX <1>A<2>B<3>C";
char first[MAXC] = "",
second[MAXC] = "",
third[MAXC] = "",
fourth[MAXC] = "";
/* read a line from the stream and simply call sscanf */
if (sscanf (a, " %s %s %s %s", first, second, third, fourth) == 4)
printf ("%s %s %s\n", third, first, fourth);
return 0;
}
(这会产生大大简化代码的副作用,并且可能会加快它的速度。)
如果您无法确定最大尺寸,那么您会遇到printf
/ $ ./bin/staticbuf
XXX Quote <1>A<2>B<3>C
的开销(或使用POSIX malloc
并让它处理分配)。
答案 1 :(得分:1)
像这样更改main
:
int main(void)
{
const char *a = "Quote {0.0.0.0} XXX <1>A<2>B<3>C";
char *buff = parse(a);
SEND_MESSAGE(buff);
free(buff);
return 0;
}
并删除free
中return
之后的parse
。您还需要为output
分配足够的空间:
char *output = malloc(1024); //for example
正如对该问题的评论所提到的那样,最好将output
声明为全局变量(因此将前一行放在parse
之外),并将free
声明为程序结束(在输入流的字符串循环之外)。这使得程序确实更快。