【问题标题】:Why the thrid parameter of the wcstok_s function is a dimensional pointer?为什么wcstok_s函数的第三个参数是维指针?
【发布时间】:2015-04-25 04:24:05
【问题描述】:

wcstok_s函数是如何实现的?

wcstok函数只有两个参数,第二次调用时如何保存字符串,第一个参数为'null'。

这两个是如何返回指针和函数结束,以及为什么保留临时内存,它会返回一个以'\0'结尾的*wchar字符串;

这是我的错误代码:

TCHAR *mywtok(TCHAR *tszText, int x, TCHAR *tnext) {
    TCHAR res[1005];
    if (tszText == nullptr)
        tszText = tnext;
    int len = wcslen(tszText);
    int rlen = 0;
    for(int i = 0; i < len; i++){
        if (tszText[i] != x) {
            res[rlen++] = tszText[i];
        }
        else {
            res[rlen] = '\0';
            tnext = tszText + i;
            return res;
        }
    }
    res[rlen] = '\0';
    tnext = nullptr;
    return res;
}

wcstok_s 是忽略 "",例如 ",,a",它会返回 "a",如果我想返回 "",则返回 "a" 或 "","","a"。

【问题讨论】:

    标签: c++ c pointers memory


    【解决方案1】:

    应该在函数末尾修改 tnext 指向的指针,以在最后一个匹配的标记末尾的字符处保存一个指针,因此您可以像本例一样遍历所有匹配项:

    https://msdn.microsoft.com/en-us/library/ftsafwz3.aspx

    所以,回答你的问题,它是一个指向指针的指针,因为函数需要修改指针指针以允许循环。

    【讨论】:

      【解决方案2】:
      TCHAR *mywtok(TCHAR *tszText, TCHAR *ch, TCHAR **tnext) {
          TCHAR res[1005];
          if (tszText == nullptr)
              tszText = *tnext;
          int len = wcslen(tszText);
          int rlen = 0;
          for(int i = 0; i < len; i++){
              if (tszText[i] != ch[0]) {
                  res[rlen++] = tszText[i];
              }
              else {
                  res[rlen] = '\0';
                  *tnext = tszText + i+1;
                  wcscpy_s(tszText, wcslen(res)+1, res);
                  return tszText;
              }
          }
          res[rlen] = '\0';
          tnext = nullptr;
          wcscpy_s(tszText, wcslen(res)+1, res);
          return tszText;
      }
      

      指针只是修改它的值,指向指针的指针可以使指针指向其他位置。

      但是为什么 wcstok 函数只有两个参数也可以使用 nullptr 作为第一个参数呢?

      【讨论】:

        猜你喜欢
        • 2023-03-20
        • 2018-04-23
        • 2011-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        相关资源
        最近更新 更多