🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: japan.comp.lang.visual-c++
Article #63

Re: VC++6.0での文字列の操作について

#63
From: 電子のお針箱
Date: Sat, 01 May 1999 00:00
59 lines
3542 bytes
> 現在作成しているプログラムでわからない所があります。
> テキストファイルを一行単位で読み込んで、CString型の変数に格納し
> ます。格納しているデータの例は以下のとおりです。
> あいうえお<TD>かきくけこ</TD>さしすせそ<TD>たちつてと</TD>
> というようになっています。これを、<TD>と</TD>を抜き出して、
> あいうえお・かきくけこ・さしすせそ・たちつてと、にします。
> そしてこれらを別々のCString型の変数に格納したいのです(できれば
> 配列にしたい)。

  // 元の文字列 (壊されるので、必要ならコピーを取ってね。)
  CString S(_T("あいうえお<TD>かきくけこ</TD>"
    "さしすせそ<TD>たちつてと</TD>"));
  CString C[2];    // デリミタ
  CString D[100];  // 結果格納エリア
  C[0] = "<TD>";   // デリミタを設定。
  C[1] = "</TD>";
  int di = 0;      // 結果の個数
                   // 元の文字列がある限り...
  while(0 < S.GetLength()) {
    int ci;        // デリミタ配列用のインデックス
    int sp = -1;   // デリミタの開始位置 (-1 は見つからない時)
    int len;       // デリミタの長さ

                   // デリミタと一致するところがあるか ?
    for(ci = 0; ci < 2; ci++){
      int sp1 = S.Find(C[ci]);
                   // とりあえずあった...
      if(0 <= sp1){
                   // 開始位置が未定義か以前見つかったものより左
                   // に有る時...
        if(sp < 0 || sp1 < sp){
                   // その位置を覚えておく。
          sp = sp1;
                   // 同時にその時のデリミタの長さを覚えておく。
                   // (後でデリミタをスキップする時に使う。)
          len = C[ci].GetLength();
        }
      }
    }
    if(sp < 0){    // デリミタが見つかったか ?
      D[di++] = S; // 見つからない時は、残りの文字列をセットして...
      break;       // 退散する。
    }
                   // デリミタまでを抜き出してセットする。
    D[di++] = S.Mid(0, sp);
                   // 今回見つかったデリミタ以降の文字列をセットする。
    S = S.Mid(sp + len);
  }
  // ここまで来たら D[] に結果が、di に結果の個数が入っています。

  なお、D[] のレンジチェックはしていませんのであしからず。(上限がある
なら、D[] の定義の時にその上限+αで定義して下さい。(でも結構上限なん
か変わりそうだから、チェックしておいたほうが無難かも...。))

-- 
-------------------
電子のお針箱
GED03577@nifty.ne.jp
-------------------
Technical Details
Message-ID: <01be93f4$bdeece00$0100a8c0@fmv57d4s6b>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <7ga1mu$ivb$1@meshsv230.tk.mesh.ad.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: 110a07,979ad9fc6dab1dd1
X-Google-Attributes: gid110a07,public
X-Google-Thread: 10a2c7,979ad9fc6dab1dd1
X-Google-Attributes: gid10a2c7,public
From: "電子のお針箱" <GED03577@nifty.ne.jp>
Subject: Re: VC++6.0での文字列の操作について
Date: 1999/05/01
Message-ID: <01be93f4$bdeece00$0100a8c0@fmv57d4s6b>
X-Deja-AN: 472938124
Content-Transfer-Encoding: 8bit
References: <7ga1mu$ivb$1@meshsv230.tk.mesh.ad.jp>
Content-Type: text/plain; charset=ISO-2022-JP
X-Complaints-To: usenet@news-jp.nifty.ne.jp
X-Trace: news-jp1.nifty.ne.jp 925578698 11326 202.219.187.123 (1 May 1999 17:11:38 GMT)
Organization: NIFTY SERVE
Mime-Version: 1.0
Reply-To: "$BEE;R$N$*?KH"(J" <yueno@kanagawa.hitachi.co.jp>
NNTP-Posting-Date: 1 May 1999 17:11:38 GMT
Newsgroups: japan.comp.lang.visual-c++,fj.os.ms-windows.programming