MFC基础--CString的Tokenize()和_tcstok()的用法对比

本文对比了Tokenize()和_tcstok()两种字符串分割方法的使用,通过实例展示了它们在处理特定字符串时的不同表现。

     Tokenize()和_tcstok()都是用来分割字符串的方法。但是其各自的使用还是有很多不同。

     下面对字符串“%s111gdfafd%s\t023232%s\t1%s\t2%s\t3%s\t4%s\t0XFF0000%s\tfdas”用这两个函数都进行一些相同匹配分割处理,代码和结果对比如下:    

Tokenize():

#include "stdafx.h"
#pragma once

#include <stdio.h>
#include <tchar.h>
#include <vector>
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
#endif

#include <afx.h>
#include <afxwin.h>         // MFC 核心组件和标准组件
#include <iostream>//函数功能:按指定长度截取字符串前面的部分

int _tmain(int argc, _TCHAR* argv[], TCHAR* envp[])
{
    CString sBuf=_T(" %s111gdfafd%s\t023232%s\t1%s\t2%s\t3%s\t4%s\t0XFF0000%s\tfdac");
    CString Seperator = _T("1%s\t");
    int Position = 0;
    CString Token;

    Token = sBuf.Tokenize(Seperator, Position);
    while(!Token.IsEmpty())
    {
        // Get next token.
        Token = sBuf.Tokenize(Seperator, Position);//从iStart位置取出字符串中含pszTokens分割符间的内容;
        
        TCHAR* szTrunc = new TCHAR[Token.GetLength() + 1];//将结果保存在堆里
        _tcscpy(szTrunc,Token);//结果拷贝

        std::wcout<<szTrunc<<std::endl;

        if (_tcslen(szTrunc) > 0)
        {
            delete [] szTrunc;
        }

    }
    system("pause");
    return 0;
}
 

_tcstok():

#include "stdafx.h"
#pragma once
#include <stdio.h>
#include <tchar.h>
#include <vector>
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
#endif

#include <afx.h>
#include <afxwin.h>         // MFC 核心组件和标准组件
#include <iostream>//函数功能:按指定长度截取字符串前面的部分

int _tmain(int argc, _TCHAR* argv[], TCHAR* envp[])
{
    CString str = _T("%s111gdfafd%s\t023232%s\t1%s\t2%s\t3%s\t4%s\t0XFF0000%s\tfdas");
    TCHAR seps[] = _T("1%s\t");
    TCHAR* token = _tcstok( str.GetBuffer(), seps );
    while( token != NULL )
    {
         //MessageBox( token, token, MB_OK );
        //MessageBox(_T("dfzdsas"));
        std::wcout<<token<<std::endl;
        token = _tcstok( NULL, seps );//这一句删去会导致无限循环
    }
    system("pause");
    return 0;
}

转载于:https://www.cnblogs.com/xueniwawa/p/3798693.html

<think>好的,用户想了解MFC中的_tcstok_s函数用法、示例解析。我需要先回忆这个函数的相关知识,确保准确无误。首先,_tcstok_s是C运行时库中的安全版本字符串分割函数,主要用于多字节Unicode字符集的兼容。在MFC中,通常会用类似的函数处理CString或其他字符串类型。 接下来,我应该先介绍函数的基本参数,比如第一个参数是待分割的字符串,第二次调用时传NULL,分隔符上下文指针。然后给出一个示例代码,演示如何分割字符串,比如用逗号分隔的例子。需要确保代码正确,使用正确的参数传递方式,特别是上下文指针的位置。 然后,解析部分要说明每个参数的作用,强调安全版本的改进,比如上下文参数避免静态变量带来的线程安全问题。同时,提到与_tcstok的区别,安全性兼容性方面的重要性。 用户可能需要知道为什么使用这个函数而不是其他方法,或者常见错误,比如多次调用时的处理。此外,注意使用Unicode环境下的宽字符处理,比如_T宏的使用,确保示例代码的兼容性。 还要检查是否有站内引用需要添加,但用户提到的是参考站内引用,但问题中没有提供具体的引用来源,所以可能暂时不需要添加脚注。最后,生成相关问题时要围绕函数用法、安全机制、与旧版本的区别,以及常见问题处理。</think>### MFC中_tcstok_s函数解析 #### 函数说明 `_tcstok_s` 是MFC中用于字符串分割的安全版本函数,支持多字节Unicode字符集(通过`TCHAR`宏实现兼容)。其原型为: ```cpp TCHAR* _tcstok_s( TCHAR* str, const TCHAR* delimiters, TCHAR** context ); ``` - **str**:首次调用时传入待分割字符串,后续调用传`NULL` - **delimiters**:分隔符集合(支持多字符) - **context**:上下文指针,保存分割状态避免重入问题 #### 代码示例 ```cpp #include <tchar.h> #include <cstdio> int main() { TCHAR data[] = _T("apple,banana;cherry|orange"); TCHAR* context = nullptr; TCHAR* token = _tcstok_s(data, _T(",;|"), &context); while (token != nullptr) { _tprintf(_T("分割结果: %s\n"), token); token = _tcstok_s(nullptr, _T(",;|"), &context); } return 0; } ``` #### 关键解析 1. **安全机制**:相比`_tcstok`,通过`context`参数显式保存状态,避免使用静态变量导致的线程安全问题 2. **兼容性**:`TCHAR``_tprintf`确保代码在Unicode(`wchar_t`)多字节(`char`)编码下的兼容性 3. **分割逻辑**: - 首次调用需传入原始字符串 - 后续调用第一个参数必须为`NULL` - 自动跳过连续分隔符 4. **内存安全**:原始字符串会被修改(插入`\0`),建议操作副本
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值