【发布时间】:2020-05-19 01:24:26
【问题描述】:
假设我有一个 char 缓冲区,其中的数据用 char ":"; 分隔;
char pt[256] = "pt:ct:mac";
char *plain_text;
char *cipher_text;
char *mac;
char *next = NULL;
char *tokens = NULL;
const char sep[2] = ":";
tokens = strtok_r(pt, sep, &next);
do
{
if(i == 0)
{
int ln = strlen(tokens);
plain_text = (char*)malloc(ln * 1);
i++;
continue;
}
if(i == 1)
{
int ln = strlen(tokens);
cipher_text = (char*)malloc(ln * 1);
i++;
continue;
}
if(i == 2)
{
int ln = strlen(tokens);
mac = (char*)malloc(ln * 1);
i++;
continue;
}
}
while((tokens = strtok_r(NULL, sep, &next)) != NULL);
free(plain_text);
free(cipher_text);
free(mac);
,所以问题是如何以正确的方式处理 strtok_r 输出结果。
基本上,主要目的是从 pt 字符串中获取结果,并将其放入动态容器中。因为,我不知道 plain_text 和 cipher_text 的大小。
这是正确的编程方式吗?
除此之外,如果确实看到一些小错误或可以用更好的做法编写的东西,请告诉我;)谢谢!
【问题讨论】:
-
仅供参考,我假设您的测试数据是示例性的,但最终您是从预定义值之外的某个地方获取数据。一种“正确”的方法是实际测试 first 调用,而不是忽略潜在的错误。如果您没有想到,
strtok_r甚至可以在您忽略的 first 调用中返回 NULL。这将是足够简单的地址,你真的应该。只是说。