我想知道在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”,加载的第二行是“”(没有),加载的第三行也是“”(没有),第四行line也是“”没有,加载的第五行是“PartNumberTwo”,第六行是PartNumber3。
我只想加载ThisISSomeTxt和PartNumberTwo :?我怎么能这样做?
答案 0 :(得分:1)
为什么不使用System::String::Split(..)?
答案 1 :(得分: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 );
}
}
答案 2 :(得分:1)
我认为你可以用String.Split方法做你需要做的事情。
首先,我认为您期望'count'参数的工作方式不同:您传入2
,并期望返回第一个和第二个结果,并且第三个结果将被抛出。实际返回的是第一个结果,第二个结果是第三个结果连成一个字符串。如果您想要的只是ThisISSomeTxt
和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'