2
 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++ 新手,如果我能够在第二个循环中打印相同的字符串,我会在第一个循环中得到所有字符串我不知道你没有得到

提前致谢

4

3 回答 3

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'
于 2012-05-09T10:06:28.503 回答
2

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

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

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

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

  4. 如果你有一个char *char []缓冲区,你仍然可以使用这个方法,因为你可以把它变成一个std::string(如果它没有被一个空字符终止,你还需要给构造函数提供缓冲区的长度)。

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

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

#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;
}
于 2012-05-10T01:20:14.073 回答
0

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

于 2012-05-09T10:04:53.537 回答