c++11 - 使用 CString 实现 tokenize 函数

标签 c++11 visual-c++ mfc c-strings

为了学习,我正在尝试使用 CStrings 实现我自己的简单 Tokenize 函数。我目前有这个文件:

11111
22222
(ENDWPT)


222222
333333
(ENDWPT)
6060606
ggggggg
hhhhhhh
(ENDWPT)
iiiiiii
jjjjjjj
kkkkkkk
lllllll
mmmmmmm
nnnnnnn

我想用分隔符(ENDWPT)对其进行标记。 我编写了以下函数,它尝试找到分隔符位置,然后添加分隔符长度并将文本提取到该位置。之后,更新所使用的计数器,以便下次调用该函数时,它开始从前一个索引搜索分隔符。该函数如下所示:

bool MyTokenize(CString strText, CString& strOut, int& iCount)
{
    CString strDelimiter = L"(ENDWPT)";
    int iIndex = strText.Find(strDelimiter, iCount);

    if (iIndex != -1)
    {
        iIndex += strDelimiter.GetLength();
        strOut = strText.Mid(iCount, iIndex);
        iCount = iIndex;
        return true;
    }
    return false;
}

并且被这样调用:

int nCount = 0;

while ((MyTokenize(strText, strToken, nCount)) == true)
{
    // Handle tokenized strings here
}

现在,该函数正在以错误的方式分割字符串,我认为这是因为 Find() 可能返回错误的索引。我认为它应该返回12,但实际上返回14?? 我已经没有想法了,如果有人能解决这个问题,我将非常感激。

最佳答案

如果找到分隔符 (iIndex),则读取从 (iCount) 开始的 iIndex - iCount 计数。然后修改iCount

if(iIndex != -1)
{
    strOut = strText.Mid(iCount, iIndex - iCount);
    iCount = iIndex + strDelimiter.GetLength();
    return true;
}

源字符串可能不以分隔符结尾,它需要特殊情况。

您还可以选择更好的名称来匹配CString::Mid(int nFirst, int nCount)的用法,以使其更易于理解。 MFC 使用 camelCase 编码风格,在变量前面添加类型标识符,这在 C++ 中是不必要的,在本例中我将避免使用它:

bool MyTokenize(CString &source, CString& token, int& first)
{
    CString delimeter = L"(ENDWPT)";
    int end = source.Find(delimeter, first);

    if(end != -1)
    {
        int count = end - first;
        token = source.Mid(first, count);
        first = end + delimeter.GetLength();
        return true;
    }
    else
    {
        int count = source.GetLength() - first;
        if(count <= 0)
            return false;

        token = source.Mid(first, count);
        first = source.GetLength();
        return true;
    }
}

...

int first = 0;
CString source = ...
CString token;
while(MyTokenize(source, token, first))
{
    // Handle tokenized strings here
}

关于c++11 - 使用 CString 实现 tokenize 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49838417/

相关文章:

c++ - make_signed<unsigned long>::type 是 int?

visual-c++ - 无法找到#include "SDL.h"

c++ - MFC 在执行自定义验证之前初始化日期时间选择器控件

c++ - 读取文件编码的 CStdioFile 问题

C++ 嵌入式模板模板

c++ - Netbeans 中的错误 "Unable to resolve identifier"

c++ - std::initializer_list 无法从 <brace-enclosed initializer list> 推导出来

c++ - OLE 入门 - 什么是好的学习项目选择?

c++ - 什么提供了 C/C++ 运行时库?

c++ - 有没有办法在 C++/MFC 中使用 SHORT 系统时间图片?