1

我想知道如何(以及最好以哪种方式)在 C++/CLI 中拆分具有未知数量空格的字符串作为分隔符?

编辑:问题是空间号是未知的,所以当我尝试使用这样的拆分方法时:

String^ line;
StreamReader^ SCR = gcnew StreamReader("input.txt");
while ((line = SCR->ReadLine()) != nullptr && line != nullptr)
{
     if (line->IndexOf(' ') != -1)
        for each (String^ SCS in line->Split(nullptr, 2))
        {
            //Load the lines...

        }
}

这是 Input.txt 的外观示例:

ThisISSomeTxt<space><space><space><tab>PartNumberTwo<space>PartNumber3

然后当我尝试运行程序时,加载的第一行是“ThisISSomeTxt”,加载的第二行是“”(无),加载的第三行也是“”(无),第四行也是""什么都没有,加载的第五行是“PartNumberTwo”,第六行是PartNumber3。

我只希望加载 ThisISSomeTxt 和 PartNumberTwo :? 我怎样才能做到这一点?

4

3 回答 3

1

为什么不直接使用System::String::Split(..)

于 2012-08-12T20:45:12.323 回答
1

以下代码示例取自http://msdn.microsoft.com/en-us/library/b873y76a(v=vs.80).aspx#Y0,演示了如何使用 Split 方法标记字符串。

using namespace System;
using namespace System::Collections;
int main()
{
   String^ words = "this is a list of words, with: a bit of punctuation.";
   array<Char>^chars = {' ',',','->',':'};
   array<String^>^split = words->Split( chars );
   IEnumerator^ myEnum = split->GetEnumerator();
   while ( myEnum->MoveNext() )
   {
      String^ s = safe_cast<String^>(myEnum->Current);
      if (  !s->Trim()->Equals( "" ) )
            Console::WriteLine( s );
   }
}
于 2012-08-12T20:48:50.037 回答
1

我认为你可以用 String.Split 方法做你需要做的事情。

首先,我认为您期望 'count' 参数以不同的方式工作:您传入2,并期望返回第一个和第二个结果,并抛出第三个结果。它实际返回的是第一个结果,第二个和第三个结果连接成一个字符串。如果你想要的只是ThisISSomeTxtand PartNumberTwo,你会想要在前 2 个之后手动丢弃结果。

据我所知,您不希望在返回字符串中包含任何空格。如果是这样的话,我认为这就是你想要的:

String^ line = "ThisISSomeTxt   \tPartNumberTwo PartNumber3";
array<String^>^ split = line->Split((array<String^>^)nullptr, StringSplitOptions::RemoveEmptyEntries);
for(int i = 0; i < split->Length && i < 2; i++)
{
    Debug::WriteLine("{0}: '{1}'", i, split[i]);
}

结果:

0: 'ThisISSomeTxt'
1: 'PartNumberTwo'
于 2012-08-13T17:41:41.020 回答