std::stringでCStrng.Format()みたいな事ってできますか – プログラミング – Home

通知
すべてクリア

[解決済] std::stringでCStrng.Format()みたいな事ってできますか


ちひろ
 ちひろ
(@ちひろ)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

タイトルの通りなのですが、
あるクラスの中を見ていたら、MFCの派生でないクラスで、ほとんど
APIのみで書いてあるのですが、CStringだけは一部使ってます。
早急な用途はないのですが、CStringさえ使わなければSDKでも使いまわせるなあ、
なんて思ったのです。
普通の代入や連結はできても、Formatのような使い方がわかりません。

sprintf(str.c_str(),iの数値は%dです,i)

こう書いたら、const char* から char*への代入はできません。
といわれました。(まあ、あたりまえなんですが)
str.begin()を入れたら落ちました。(これもあたりまえ)

char配列を作っておいて、それにsprintfしてから代入すればもちろんできるのですが、
もうちょっとスマートな書き方があるのかなと思いまして…

よろしくお願いします。

環境はwin2000 sp3 VC++6 sp5 MFCです


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

#include <sstream>
#include <string>

std::ostringstream stream;
stream << iの数値は << i << です;
std::string str = stream.str();


返信引用
ちひろ
 ちひろ
(@ちひろ)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

επιστημηさんレスありがとうございます。

std::ostringstreamなるものがあるんですね。

私の持ってる、ピアソン・エデュケーション社の
標準テンプレートライブラリによるC++プログラミング第2版には、
載ってませんでした。

STLってstring vector list map ..のコンテナと反復子、それとアルゴリズム
って思ってたのに他にいろいろあるんですね。

こういうのって一度本腰入れて、ヘッダー全部読むものなのかな。
もっと勉強します。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

私はこんな関数を作ってずっと使ってます。汚いソースだけど、参考になれば。

// printf 形式のフォーマット
static string Format( const char* format, ... ){

static std::vector<char> tmp(1000);

va_list args, source;
va_start(args, format);
source = args;

while(1){
args = source;

if( _vsnprintf( &tmp[0], tmp.size(), format, args ) == -1 ){
tmp.resize( tmp.size() * 2 );
}else{
break;
}
}
tmp.push_back('\0');
string ret = &(tmp[0]);
va_end(args);
return ret;
}


返信引用
ちひろ
 ちひろ
(@ちひろ)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

解決チェックしてしまったんですが、また教えてください。
早速やってみたのですが、たった4行なのにコンパイルエラーになってしまいました。

ただのスペルミスかと思って何度も見直したんですが、あっていると思います。
やった事は、新規作成 - MFC - SDI -ドキュメントなし にこれだけ書いたのですが、
何か他に必要なのでしょうか。

#include stdafx.h
#include STLTest.h
#include ChildView.h
#include <string>
#include <sstream> <-これを追加

-------------------------------
void CChildView::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト

// TODO: メッセージ ハンドラのコードをここに追加してください。
int a = 500;

std::ostrstream str ;

str << _T(aの値は) << a <<_T(です) ;

dc.TextOut(20,20,str.c_str());

// 描画のために CWnd::OnPaint を呼び出してはいけません。
}
エラー内容
E:\C++\STLTest\ChildView.cpp(58) : error C2039: 'ostrstream' :
'std' のメンバではありません。
E:\C++\STLTest\ChildView.cpp(58) : error C2065: 'ostrstream' :
定義されていない識別子です。
E:\C++\STLTest\ChildView.cpp(58) : error C2146: 構文エラー :
';' が、識別子 'str' の前に必要です。
E:\C++\STLTest\ChildView.cpp(58) : error C2065: 'str' :
定義されていない識別子です。
E:\C++\STLTest\ChildView.cpp(60) : error C2297: '<<' :
不正な右オペランドです。

using namespace std ;を入れてstd::をはずしても同じ状況です。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

ostrstream ではありません。
ostringstream です。


返信引用
ちひろ
 ちひろ
(@ちひろ)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

>ostrstream ではありません。
>ostringstream です。

失礼しました。(^^ゞぜんぜんスペルミスでした。
> dc.TextOut(20,20,str.c_str());
ここもコンパイラにおこられました。

dc.TextOut(20,20,str.str());
こう直してもおこられました。

stringに入れなおしてやっとコンパイルできました。

PAIさん レスありがとうございます。
私も作ろうかと考えましたが、ありがちなもの自分で作るのって
私なんか抵抗あるんですよね。
皆さんそういうのはきっと作られているんでしょうね。

皆さんありがとうございました。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

> dc.TextOut(20,20,str.str());
> こう直してもおこられました。

dc.TextOut(20,20,str.str().c_str());


返信引用
ちひろ
 ちひろ
(@ちひろ)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

επιστημηさん、何度もすみません。
エラーメッセージ出すだけのところに
string と ostringstreamの両方呼ぶのなんかやだなあと
思ってたところでした。
ありがとうございました。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

> std::ostringstreamなるものがあるんですね。
>
> 私の持ってる、ピアソン・エデュケーション社の
> 標準テンプレートライブラリによるC++プログラミング第2版には、
> 載ってませんでした。

ストリーム族は、STLには(厳密には)含まれません。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました