使用strtok拆分字符串

时间:2012-05-09 09:59:10

标签: c++ arrays

 char *strings[30];
 char Policystr[4096] = "the|string|to|split"; 
 char delims[] = "|";
 int i = 0;

 strings[i] = strtok( Policystr, delims )
 while( strings[i] != NULL  ) 
{
        MessageBoxA(NULL,strings[i],"stringsComparison",MB_OK);
        strings[++i] = strtok( NULL, delims );          
}
for ( int j = 0; j < i; j++ ) 
 {
     MessageBoxA(NULL,strings[j],"strings",MB_OK);
 }

我是C ++的新手我在第一个循环中获得所有字符串如果我能够在第二个循环中打印相同的我不知道我没有得到

提前致谢

3 个答案:

答案 0 :(得分:2)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char *strings[30];
    char Policystr[4096] = "the|string|to|split"; 
    char delims[] = "|";

    int i = 0;
    strings[i] = strtok( Policystr, delims );
    while( strings[i] != NULL  ) 
    {
        printf("%d '%s'\n", i, strings[i]);
        strings[++i] = strtok( NULL, delims );          
    }

    for ( int j = 0; j < i; j++ ) 
    {
        printf("%d '%s'\n", j, strings[j]);
    }
}

输出:

0 'the'
1 'string'
2 'to'
3 'split'
0 'the'
1 'string'
2 'to'
3 'split'

答案 1 :(得分:1)

你的问题被标记为C ++,但你正在操纵字符串数据,就像1985年的C程序员一样(没有冒犯,只是现在通常不鼓励使用strtok)。由于您使用的是C ++,我建议您避免使用C库函数,而应使用C ++标准库中提供的功能。这是一个完全独立的工作示例,用于在C ++中拆分std::string的一种方法。我是C ++的新手,所以这可能不是最有效的方法。这种方法的好处是:

  1. 内存管理是自动处理的,程序对输入或输出的大小没有任何限制。

  2. 不使用旧的(并且不鼓励使用)C库函数。

  3. 您不必修改原始输入数据以拆分字符串,这意味着您可以对const限定输入进行操作。这是strtok无法执行的操作,因为strtok会修改原始输入。

  4. 如果您有char *char []缓冲区,您仍然可以使用此方法,因为您可以将其转换为std::string(如果它不是由null终止你还需要给构造函数赋予缓冲区的长度。

  5. 如果要从向量中的std::string个对象之一创建消息框,可以使用.c_str()成员函数,例如

    MessageBoxA(NULL, results[i].c_str(), "strings", MB_OK);
    

  6. #include <string>
    #include <iostream>
    #include <vector>
    
    int main(void)
    {
        std::string delims = "|";
        std::string policyStr = "the|string|to|split";
        std::vector<std::string> results;
        size_t lastOffset = 0;
    
        while(true)
        {
            size_t offset = policyStr.find_first_of(delims, lastOffset);
            results.push_back(policyStr.substr(lastOffset, offset - lastOffset));
            if (offset == std::string::npos)
                break;
            else
                lastOffset = offset + 1; // add one to skip the delimiter
        }
    
        for (size_t i = 0; i < results.size(); i++)
            std::cout << results[i] << std::endl;
    
        return 0;
    }
    

答案 2 :(得分:0)

尝试在开始使用之前初始化i=0。在第一个循环中,您必须编写MessageBoxA(NULL,strings[i],"stringsComparison",MB_OK);