CString型で置換


Junix  2003-11-14 18:13:06  No: 52506  IP: [192.*.*.*]

CString::Replace関数を使用せずに文字列内の"+"を"-"に置換したいのですが、どうすればよいのでしょうか?
例えば、
CString a;でa={"aaa+bb+cc"}を
Cstring b;でb={"aaa-bb-cc"}
に置換したり、
CStringList list;のようなリストを構築して
CString aの中に{"aaa+bb+cc"}と{"+ddd+ee+fff+"}と{"g+hhh+i"}
があったとした場合、aのリストの"+"を全て"-"にできますでしょうか?
ご教授お願いします。

編集 削除
OP  2003-11-14 18:58:10  No: 52507  IP: [192.*.*.*]

文字の置換はCStringにそのまんまの名前のメンバ関数があります。
MSDN見てください。

>CString a;でa={"aaa+bb+cc"}を
>Cstring b;でb={"aaa-bb-cc"}

aからbにコピーした後置換すればいいでしょう。

>CStringList list;のようなリストを構築して
>CString aの中に{"aaa+bb+cc"}と{"+ddd+ee+fff+"}と{"g+hhh+i"}
>があったとした場合、aのリストの"+"を全て"-"にできますでしょうか?

リストの各要素に置換を行えばいいです。

編集 削除
AUT`s  2003-11-14 19:29:18  No: 52508  IP: [192.*.*.*]

> CString::Replace関数を使用せずに
その前に、なぜ使用しないのか理由を書きま。

> リストの"+"を全て"-"にできますでしょうか?
...MFCをVBかScriptとかと勘違いしてる?

編集 削除
___  2003-11-15 09:13:25  No: 52509  IP: [192.*.*.*]

http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200311/03110015.txt
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200311/03110023.txt

結局何がしたいの?
もしかしてちょっと疑問に思ったことを片っ端から聞いてるだけ?

編集 削除
Junix  2003-11-17 08:56:25  No: 52510  IP: [192.*.*.*]

Replace関数を使用するとCStringのメンバではありませんとなってしまいます。(使用ソフトVC5.0)したがってReplace関数のような置換を行いたいのですがなかなかCStringも文字列から指定文字を置換できずに悩んでいます。

編集 削除
___  2003-11-17 09:51:30  No: 52511  IP: [192.*.*.*]

>Replace関数を使用するとCStringのメンバではありませんとなってしまいます。(使用ソフトVC5.0)

VC5.0のMFCではCString::Replaceが無いってこと?そんなバカな。
それともMFC以外のライブラリでのCStringを使ってるのかな?

一文字置き換えるだけなら
  CString string;
  string = "abc+";
  string.SetAt (3,'-' );
とか出来るけどReplaceが使えないんじゃこれもダメかな?

ちょっと詳しい環境とソースも提示してよ。
MFC使ってるかどうかコンソールアプリなのかMFCAppWizardなのかとか
Windowsのヴァージョンとか。

編集 削除
Junix  2003-11-17 11:37:05  No: 52512  IP: [192.*.*.*]

コンソールアプリでした!!コンソールでReplace関数を引き出すためにはどうしたらよいでしょうか??

編集 削除
tetrapod  2003-11-17 12:21:24  No: 52513  IP: [192.*.*.*]

前の質問は「本当に」解決したのですか?
それならここで改めて訊くはずもないか...

VC++6 の App.Wizard なら「コンソールアプリでMFC」という選択肢が出ます。
VC++5 には無かったはず。
でもまあ MSDN で AfxWinInit の説明見れば簡単でしょう。

CString a=_T("a+b+c");
a.Replace(_T("+"), _T("-"));
で楽勝。

編集 削除
YuO  2003-11-17 13:19:45  No: 52514  IP: [192.*.*.*]

CString::ReplaceはVC++6.0以降付属のMFCでないと使えません。
CString::FindとCString::SetAtで代用でしょうね。

編集 削除
tetrapod  2003-11-17 16:17:25  No: 52515  IP: [192.*.*.*]

>CString::ReplaceはVC++6.0以降付属のMFCでないと使えません。
なんとそうですか!困り者ですね。

>CString::FindとCString::SetAtで代用でしょうね。
御意。

文字数が変わらないなら CString など使わずとも
char* func(char* s) {
  for (char* p=strchr(s, '+'); p; p=strchr(p, '+')) *p='-';
  return s;
}
とか。
文字数が変わるのならメンドクサイですね。

STL がまともに使えるのなら例えば
http://cham.ne.jp/piro/p_cp.html
とか。
でも VC++5 って *まともな* STL 使えましたっけ?

編集 削除
YuO  2003-11-17 18:53:46  No: 52516  IP: [192.*.*.*]

え〜っと,dinkumwareの訴訟の話を考えると,VC++ 6.0とほとんど変わらないはずです。
#つまりは,あまり「まとも」とは言えない。

でも,例示されたreplace関数程度ならまともに動きますよ。
メモリが無くなるとbad_allocも発生させずに落ちてくれますが……。

編集 削除
Junix  2003-11-18 12:06:58  No: 52517  IP: [192.*.*.*]

Replace関数も対応していないのですがInsert関数も対応してませんよね?
CStrins a = "cc=bb"の文字列の空白を挿入してa = "cc = bb"
とか?を挿入してa = "cc = ?bb"とかしたいのですがどうすればよいでしょうか?

編集 削除
tetrapod  2003-11-18 12:20:52  No: 52518  IP: [192.*.*.*]

簡単な解決策。
VC++5 を捨てて VC++7 (VC++.net) に乗り換える。
CString を捨てて std::string を使う。
がんばって自分で作る。

# 大マヂっす。
# 古い処理系で無駄な努力を続ける人件費より
# 新しい処理系を購入する費用のほうが安いと思う。

編集 削除
AUT`s  2003-11-18 15:17:39  No: 52519  IP: [192.*.*.*]

そこまでするなら、普通にCStringを継承して各メンバを追加したら?
少しは自分でプログラムしる!

編集 削除
tetrapod  2003-11-20 08:49:16  No: 52520  IP: [192.*.*.*]

> 少しは自分でプログラムしる!
それは私に言ってる?それとも元発言者に言ってる?

まあ言い出しっぺさんが実装してあげてください。
私は車輪の再実装はゴメンです。再発明ならまだしも。

編集 削除
AUT`s  2003-11-20 10:47:54  No: 52521  IP: [192.*.*.*]

再実装たってほんの数行でせう。
10行程度のプログラムがそんなにキツイ仕事場なのデスカ?と思ってもみたり。
費用を抑えたいならばOpenSourceへの参加をお勧めしま。
MFCなんかよりboostの方が確実に開発効率・速度・移植性が高いぞ〜。

レス違いゴメソ。

編集 削除
なーめ  2003-11-29 14:25:53  No: 52522  IP: [192.*.*.*]

解決印がないので...

char s[1024];
CString a = "a+b+c+d";
strcpy( s, a );
char * p;
for( p = s; *p; p ++ )
{
   if( *p == '+' ) *p = '-';
}
CString b = s;
strchr() を呼び出すオーバヘッドを考えたらこのほうが速いなり。
C言語レベルでいいところをわざわざクラスにしなくてもよいのでは。

編集 削除