しかしこれって、char*を使っていますから危ないですよね。(メモリ破壊やセキュリティ上も)できれば、c++のbasic_stringを使った方がいいです。そこで、stringstrream型を使います。(それにM$のVisualStudioだと微妙に文法がg++と違い、やたらwarningを出してきます。両方で動作するプログラムを作成するとき嫌な思いをこれまでしてきました。)
改めてサンプルを作ろうと思い調べてみたら、stringstreamにはヘッダとして、strstreamとsstreamの2つがあるとのこと。違いは、strstreamの方が先輩なんですが実装にchar*を使っているとのこと。危険なので、内部の実装をbasic_stringなsstreamを使えとのことです。
まあ面倒なことはおいといて、一目でわかるサンプルを以下に示します。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// sstreamのサンプル | |
// :strstreamは内部でchar*を使っているので、basic_stringを使っているsstreamが推奨されている | |
#include <iostream> | |
#include <sstream> | |
int main() | |
{ | |
std::stringstream ss; | |
double pi; | |
double pi1; | |
// 文字列から数値に変換. | |
ss << "3.14"; | |
ss >> pi; | |
pi1 = pi + 1.0; // 数値型になっているので演算できます | |
std::cout << std::showpoint << pi << ", " << pi1 << std::endl; | |
ss.clear(); // 状態をクリア. | |
ss.str(""); // 文字列をクリア. ここが注意、clear()だけでは内部の文字列は消去できません. | |
// 数値から文字列に変換. | |
std::string ss1; | |
ss << 123 ; | |
ss1 = ss.str() + "456"; // stirng型として演算します | |
std::cout << ss.str() << ", " << ss1 << std::endl; | |
return 0; | |
} |
bash-3.2$ ./sstream 3.14000, 4.14000 123, 123456
まず、文字列をdoubleに変換して+1.0しています。次が数値をstirngsttreamに取り込み、string型でappendしています。これで大概のことはできます。
0 件のコメント:
コメントを投稿