プロが教える店舗&オフィスのセキュリティ対策術

素人で間違っているかもしれませんが、String::Splitは wchar_tのように1文字だけしか使えないので、\r\nのような2文字以上のデリミタに対応しているperlのsplit関数みたいのを探しています。
以下のソースで※ここですの部分で、2文字以上の任意のデリミタでマージ型文字列を配列にしたいです。

.NETは覚えたてですが、Vista以降でも廃れることは無いのでしょうか?
覚えて無意味はきついので・・・

/*
VC++2005でperlのようなsplit関数を実現したい
区切り文字は\r\n
*/

using namespace System;

int main( array<String^>^ args ){
String^ str = nullptr;
if (1 > args->Length ){
str = "太郎\r\n花子\\純一郎";
} else {
str = args[0];
}

// strマージ文字列をPerlのsplit関数のようなもので、以下のようなnamesを作成したい。
// $names = split /\r\n/ $str; <=※ここです。
array<String^> ^names = { "太郎", "花子", "純一郎" };

String^ name;
for each ( name in names ) {
Console::WriteLine("{0}", name);
}

return 0;
}

A 回答 (2件)

String.Split メソッド (String[], StringSplitOptions) のタイプでメソッド使えば可能ですよ



array<string^>^separator = {L"\r\n"};
names = str->Split( separator, System::SptringSplitOptions::RemoveEmptyEntries);

Console::WriteLine( L"{0}", names->Length );
for each ( name in names ) {
  Console::WriteLine( L"{0}", name );
}
といった具合です

この回答への補足

ご指摘どおり、以下のように修正して動作しました。
ありがとうございました。

しかし、コマンドラインで test a\r\nb\r\ncとした場合、splitせず
そのままa\r\nb\r\ncと表示されます。
str = L{args[0]};とする必要があるのでしょうか?



/*
VC++2005でperlのようなsplit関数を実現したい
区切り文字は\r\n
*/

using namespace System;

int main( array<String^>^ args ){
String^ str = nullptr;
if (1 > args->Length ){
str = "太郎\r\n花子\r\n純一郎";
} else {
str = args[0];
}

array<String^>^separator = {L"\r\n"};
//array<String^> ^names = { "太郎", "花子", "純一郎" };
array<String^>^names = str->Split( separator, System::StringSplitOptions::RemoveEmptyEntries);
String^ name;
for each ( name in names ) {
Console::WriteLine("{0}", name);
}

return 0;
}

補足日時:2007/08/14 11:45
    • good
    • 0

>しかし、コマンドラインで test a\r\nb\r\ncとした場合、splitせず


コマンドラインで \r\nと与えても Cで扱う CRやLFには変換されません

もし \r\nの文字列を区切りとして与えるのであれば C側でエンコードしてあげましょう
if ( args.Length < 1 ) {
  str = L"デバッグ\r\n用文字\r\n列\r\n"
} else {
  str = argv[0];
  // "\r" -> '\r'変換
  str = str.Replase( L"\\r", L"\r" );
  // "\n" -> '\n'変換
  str = str.Replase( L"\\n", L"\n" );
}
といった具合でしょう …

この回答への補足

以下でうまくいきました。
ありがとうございました。

// "\r" → '\r'変換
str = str->Replace( L"\\r", L"\r" );
// "\n" → '\n'変換
str = str->Replace( L"\\n", L"\n" );

補足日時:2007/08/14 18:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!