C - 安全地解析并发送大量无穷无尽的流中的许多字符串

时间:2016-09-05 08:06:21

标签: c zeromq

我对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)

这会有用吗?

2 个答案:

答案 0 :(得分:2)

如果您知道(或可以特别确定)每个firstsecondthirdfourth的最大尺寸,您可以消除所有可能性通过简单地为每个使用固定大小的缓冲区来记录内存泄漏。你说你的25M /秒文本被分解为,所以你可能正在使用一个面向行的输入函数(例如fgets或{{ 1}})从流中读取。在这种情况下,您也可以使用最大行长度(X4)来确保您的固定缓冲区足够。

您使用getline作为分隔符,正在标记为firstsecondthirdfourth,为什么不使用{{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;
}

并删除freereturn之后的parse。您还需要为output分配足够的空间:

char *output = malloc(1024); //for example

正如对该问题的评论所提到的那样,最好将output声明为全局变量(因此将前一行放在parse之外),并将free声明为程序结束(在输入流的字符串循环之外)。这使得程序确实更快。