Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中搜索strtok()的替代方法+;_C++_Split_Strtok - Fatal编程技术网

C++ 在C+;中搜索strtok()的替代方法+;

C++ 在C+;中搜索strtok()的替代方法+;,c++,split,strtok,C++,Split,Strtok,我使用strtok将字符串分成几个部分。 在本例中,将从字符串中读取所有部分,该字符串以冒号或分号为边界 char string[] = "Alice1:IscoolAlice2; Alert555678;Bob1:knowsBeepBob2;sees"; char delimiter[] = ":;"; char *p; p = strtok(string, delimiter); while(p != NULL) { cout << "Result: " <&l

我使用strtok将字符串分成几个部分。 在本例中,将从字符串中读取所有部分,该字符串以冒号或分号为边界

char string[] = "Alice1:IscoolAlice2; Alert555678;Bob1:knowsBeepBob2;sees";
char delimiter[] = ":;";
char *p;

p = strtok(string, delimiter);

while(p != NULL) {
    cout << "Result: " << p << endl;

    p = strtok(NULL, delimiter);
}
但我希望得到这样的结果:

Result: Alice1:
Result: Alice2;
Result: Bob1:
Result: Bob2;
限制是当我使用strtok时,我只能选择单个字符。 有人知道strtok的另一个替代方案吗?我也可以搜索字符串?
或者有人有办法解决我的问题吗?

使用您指定的数据集无法按您想要的方式正确分割它。您可以提出一个“仅此而已”的规则,将您显示的数据按字面意思进行拆分,但鉴于数据的混乱性质,很可能在其他示例中失败。让我们从这个令牌开始

IscoolAlice2
一个计算机程序怎么知道这部分的哪个是名字,哪个不是?你想让“Alice2”离开这里。如果您决定用大写字母指定一个名称,那么它只会吐出“name”IscoolAlice2。同样适用于:

knowsBeepBob2
如果您搜索第一个大写字母,则程序将确定其名称为BeepBob2,因此在每种情况下,搜索令牌中最后出现的大写字母都会找到该名称。但是如果一个名字包含两个大写字母呢?程序会把他们的名字删掉,你对此无能为力

如果你乐于接受这些限制,你可以通过strtok只使用;字符,它给出:

Alice1:IscoolAlice2
 Alert555678
Bob1:knowsBeepBob2
sees
这不太理想。然后,您可以指定一个规则,以便在包含:的任何行中都存在一个名称,将:中剩余的任何内容作为名称,然后查找最后一个大写字母,以及从该点开始的任何内容也是名称。这会给你想要的输出

但我概述的规则对于刚刚输入的数据非常具体。如果关于其他数据样本的任何内容与此完全不同(例如,名称中有两个大写字母),那么它将失败,因为程序无法确定“名称”的起始位置

解决这一问题的唯一方法是返回数据的来源,并以不同的格式对其进行格式化,以便在名称之前有某种标点符号


或者,您需要一个包含所有可能出现的名称的完整数据库,然后搜索这些名称,查找到下一个名称之前的任何字符:或;并附加它们并打印名称。但这似乎非常不切实际。

这只是一个简单的刮擦逻辑,大致如下:

char *ptr = string;

while(*ptr)
{
   printf("Result:");
   while(*ptr)
   {
      printf("%c", *ptr);
      if(ispunc(*ptr))
      {
         ptr++;
         printf("\n");
         break;
      }
      else
      {
         ptr++;
      }
   }
}
由于需要更复杂的搜索,因此无法使用strtok执行该任务

虽然我不确定什么是您的
字符串
作为分隔符,但可以使用以下命令完成相同的输出:

char string[] = "Alice1:IscoolAlice2; Alert555678;Bob1:knowsBeepBob2;sees";
char delimiter[] = "(?:Alice|Bob)\\d.";
std::regex regex( delimiter );
std::regex_iterator< const char* > first( std::begin( string ), std::end( string ), regex  ), last;

while( first != last ){
    std::cout << "Result: " << first->str() << '\n';
    ++first;
}  

您打算如何将Iscool一词与Alice2分开?没有差距。你可能想要。我认为你需要提供一个更清晰的问题陈述。你似乎在寻找在之前或之后发生的事情:以;然后把所有的东西都记下来,包括最后一个大写字母。非常感谢k-five!这正是我所需要的@卡达木不是问题
char string[] = "Alice1:IscoolAlice2; Alert555678;Bob1:knowsBeepBob2;sees";
char delimiter[] = "(?:Alice|Bob)\\d.";
std::regex regex( delimiter );
std::regex_iterator< const char* > first( std::begin( string ), std::end( string ), regex  ), last;

while( first != last ){
    std::cout << "Result: " << first->str() << '\n';
    ++first;
}  
Result: Alice1;
Result: Alice2;
Result: Bob1;
Result: Bob2;