STL string

STL string を使います。
string から Token を切り出します。

前田稔の超初心者のプログラム入門

STL string

  1. Windows10 で STL の string を使います。
    せっかく Windowsストアアプリの String の使い方が解ったのですが、使い勝手が悪くて役に立ちそうにありません。 (^_^;)
    ストアアプリの String は Store String を参照して下さい。
    仕方が無いので、STL の string が使えるか調べてみました。 (^_^;)
    STL string の文字コードは MultiByte(Sift-JIS) です。
    string クラスには、多くのメンバー関数が用意されています。
    詳細は string クラスのメンバー関数 を参照して下さい。
    STL で Unicode(wstring) を使うプログラムは STL wstring を参照して下さい。
  2. ベースとなるプロジェクト Blank App(XAML) を構築して下さい。
    手順は Windows8 C++(Store App) を参照して下さい。
    MainPage.xaml に Button を貼り付けて、Event Handler を設定して下さい。
  3. STL の string を使うときは、ヘッダファイルと using の記述が必要です。
    #include <string>
    using namespace std;
    
  4. メッセージを表示する Debug(String^ msg) 関数と、STL の string を確認する Debug(char *str) です。
    後位参照が起こらないように MainPage.xaml.cpp の using の直後にでも置いて下さい。
    Debug(char *str) で渡されるコードは Sift-JIS なので、Unicode に変換しています。
    文字コードは Program Guid を参照して下さい。
    void Debug(String^ msg)
    {
        String^ message= ref new String(msg->Data());
        message+="\r\n";
        OutputDebugString(message->Data());
    }
    void Debug(char *str)
    {
        WCHAR   wk[1000];
        MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,str,-1,wk,1000);
        OutputDebugString(wk);
        OutputDebugString(L"\r\n");
    }
    void Debug(String^ msg, int n)
    {
        String^ message= ref new String(msg->Data());
        message+= "  ";
        message+= n.ToString();
        message+="\r\n";
        OutputDebugString(message->Data());
    }
    
  5. Button Click に STL の string をテストするコードを書きます。
    string s に文字列(char *) を格納して印字してみました。
    void App1::MainPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
    {
        // STL string のテスト
        string s;
        s= (char *)"12, 3.45, {67}, { ab }; XYZ\r\n";
    
    Debug("\r\n\r\nSTL string");
    Debug((char *)s.data());
    
  6. 続いて string s から Token を切り出してみましょう。
    wk= s.find_first_not_of(" ,;{}", Col); で、Col の位置から Token の始まりを調べます。
    " ,;{}" 以外が見つかった位置が Token の開始位置です。
    wk= s.find_first_of(" ,;}\r\n", Col); で Token の終わりを調べます。
    " ,;}\r\n" のいずれかが格納されている位置が Token の終了位置です。
    Word.assign(s, Col, wk-Col); で、Col から wk-Col 文字を Work に格納します。
        string Word;
        int    Size,Col,wk;
    
        Size= s.length()-1;
        for(Col=0; Col<Size; )
        {
            wk= s.find_first_not_of(" ,;{}", Col);
            Col= wk;
            wk= s.find_first_of(" ,;}\r\n", Col);
            if (wk==Col)    break;
            Word= Word.assign(s, Col, wk-Col);
            Debug((char *)Word.data());
            Col= wk+1;
        }
    
  7. コンパイル&実行して、Button を Click すると、出力ウインドウに実行結果が印字されます。
    出力ウインドウには、プログラムの進行メッセージが沢山印字されているので、その中から探して下さい。
    STL string
    12, 3.45, {67}, { ab }; XYZ
    
    12
    3.45
    67
    ab
    XYZ
    
  8. ストアアプリの String から STL の string を生成して、Token を切り出して印字します。
    どうやらこれで STL の string を使う目途が立ちそうです。 ヽ(^^ )
    void App1::MainPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
    {
        String^ str = "12, 3.45, {67}, { ab }; XYZ\r\n";
        const char16 *w_str = str->Begin();
        // ワイド文字列から char* に戻す
        char *mbs = new char[80];
        size_t ret;
        wcstombs_s(&ret, mbs, 80, w_str, _TRUNCATE);
        // STL string s に文字列を格納
        string s;
        s = mbs;
        Debug((char *)s.data(), ret);
    
        // s の文字列から Word を切り出して印字は、上記と同じです。
            ・・・
    }
    

超初心者のプログラム入門(C/C++)