c语言对命令行字符串分割,常用的字符串分割方法

本文介绍了Windows环境下C++中三种常用的字符串分割方法:CString::Tokenize()、AfxExtractSubString()以及c语言的strtok()函数,并对比了它们的特点与使用场景。

起因:前段时间写命令行解析函数(字符串分割比较通用的例子),没有经过深入思考和分析引起了程序死循环,就想了下是否有对应的系统函数可以使用。经过一番搜索之后发现还是有几个可用的字符串分割函数,这里整理下,以作总结及后续查询使用。

当然,如果你觉得自己的字符串处理可以做的很好,可以考虑直接使用字符串查找函数做字符串分割,比如c中的字符串查找函数、CString字符查找函数、string字符查找函数等,更原始点可以直接操作内存。

windows下有以下几种可用的字符串分割方法。

CString::Tokenize()

用法如下。

// 按照token分割source字符串,结果通过cout输出

// 使用MFC的CString::Tokenize

void SplitUseTokenize(const char * source, char token)

{

CString strSource = source;

CString strToken(token);

int pos = 0;

while (-1 != pos)

{

CString strCur = strSource.Tokenize(strToken, pos);

if (!strCur.IsEmpty())

{

cout << strCur << endl;

}

}

cout << endl << endl;

}

Tokenize函数将分割好的字串放到返回值中,同时将对应的扫描位置放到第二个参数中,如果第二个参数返回-1,表示分割完成。

AfxExtractSubString()函数

// 按照token分割source字符串,结果通过cout输出

// 使用MFC中的AfxExtractSubString函数

void SplitUseExtract(const char * source, char token)

{

int pos = 0;

CString strCur = "";

while(AfxExtractSubString(strCur, source, pos, token))

{

++pos;

cout << strCur << endl;

}

cout << endl << endl;

}

AfxExtractSubString函数返回值表示是否提取子串成功,还有几个重载函数,可以参考msdn上的说明。

提取得到子串放到第一个参数中。

c语言的strtok()函数

// 按照token分割source字符串,结果通过cout输出

// 使用crt的strtok函数

void SplitUseStrtok(char * source, char token)

{

char * ptr = strtok(source, &token);

while(NULL != ptr)

{

cout << ptr << endl;

ptr = strtok(NULL, &token);

}

}

strtok函数不是线程安全的,不是可重入的,需要线程安全的函数,建议使用strtok_r函数。具体用法可参考c语言用户手册。

这里需要说明的是:

CString::Tokenize()中的PCXSTR pszTokens为分隔字符的组合,可为多个字符。

AfxExtractSubString()中的分隔字符,只能是一个字符。

另外有一点要注意:

CString::Tokenize()碰到连续多个分隔字符是作为一个处理的,AfxExtractSubString()中多个分隔符可区分处理。

strtok/strtok_r函数的处理逻辑跟CString::Tokenize()类似。

如果使用下面测试程序,输出如下:

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

{

int nRetCode = 0;

// 初始化 MFC 并在失败时显示错误

if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))

{

// TODO: 更改错误代码以符合您的需要

_tprintf(_T("错误: MFC 初始化失败\n"));

nRetCode = 1;

}

else

{

// TODO: 在此处为应用程序的行为编写代码。

char source[] = "123\n\n456\n789";

char token = '\n';

SplitUseTokenize(source, token);

SplitUseExtract(source, token);

SplitUseStrtok(source, token);

system("pause");

}

return nRetCode;

}

3cbacd8c2e12775ae89e12ee17e4a35b.png

这个输出也说明了本文中提及的注意事项问题。

注:本文涉及所有代码可使用Git直接下载:https://git.oschina.net/Tocy/SampleCode.git。实际代码位于Console目录下,名称为“20150709_StringSplit.cpp”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值