dataとc_strについてですが、
『さて,このにstr()というメンバ関数とほとんど同じ動作をする関数で,
data()というメンバンバ関数があります.このdata()も,コールす
ると文字列へのポインタが返ってきます.そういう点ではc_str()とまっ
たく同じ動作なのです.ではどこが違うのかというと,文字列が設定されていな
いときの挙動です. c_str()は,インスタンスに文字列が設定されてい
ないときには,内部であらかじめ用意されている空文字列(つまり.先頭が冒の
文字列)へのポインタが返ります.それに対してdataOメンバ関数は,NU
LT.ポインタが返るのです.この違いがわかりますか?文穿刺が設定されてい
ないstrir咀クラスインスタンスの内存をp1血Oで出力しようとした際に
,c_str()でポインタを取得すると,空文字列へのポインタが返るので,
画面には単なる改行が出力されます.それに対して,data()でポインタを
取得しようとすると,NULLポインタが返るので,puts()で,それを出
力しようとするとランタイムエラーになります.』
らしいです。

そこで、
// string str = "ABC";
string str1;
string str2;
puts(str1.c_str());
puts(str2.data());
としました。

しかし、いずれも改行が出力されます。
この2種類のメンバ関数の違いを確認する場合どうしたらいいでしょうか?