【问题标题】:How to correctly manage output of strtok_r?如何正确管理 strtok_r 的输出?
【发布时间】: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。这将是足够简单的地址,你真的应该。只是说。

标签: c strtok


【解决方案1】:

我会用指针数组来做。

char pt[256] = "pt:ct:mac";

char *next = NULL;
char *token = NULL;
char *tokens[3] = {NULL};
const char sep[2] = ":";    

token = strtok_r(pt, sep, &next);

 while(token)
 {
        int ln = strlen(token);
        tokens[i]= (char*)malloc((ln * sizeof(char)) + 1);
        strcpy(tokens[i],token);
        i++;
        token = strtok_r(NULL, sep, &next);
 }

 for (int i = 0; i< 3 && tokens[i]; i++) {
   free(tokens[i]);
   tokens[i] = NULL;
 }

【讨论】:

  • 我喜欢你的回答,据我所知,“strcpy”函数被认为是不安全的。例如,stackoverflow.com/questions/23317646/why-is-strcpy-unsafe-in-c。要更深入地了解它为什么不安全,您可以参考 Microsoft。
  • (char*)malloc((ln * sizeof(char)) + 1);在这一行。为什么要加 + 1?假设我们的 ln 为 50。那么,50 * 1 + 1。51?
  • pluss 1 持有null 字符。
猜你喜欢
  • 2013-04-04
  • 2017-10-14
  • 2019-07-25
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多