stringstreamからchar配列へ変換するより簡単な方法が存在すれば教えていただきたいです。
現在、以下のように変換をしています。
cpp
1int main() { 2 std::stringstream ss; 3 ss << "hello" << "," << "world"; 4 char char_array[256]{}; 5 for (int i = 0; i < ss.str().length(); ++i) char_array[i] = ss.str().at(i); 6 std::cout << char_array << std::endl; 7}
問題なく変換はできているのですが、ループさせるのが綺麗な方法ではない気がしています。別の方法がないか知りたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
get
というメンバ関数があるので、それが使えます。get
は最後に'\0'
を追加します。
int main() { std::stringstream ss; ss << "hello" << "," << "world"; char char_array[256]; ss.get(char_array, 256); std::cout << char_array << std::endl;
投稿2020/08/13 03:45
総合スコア430
0
C++
1#include <iostream> // cout, endl 2#include <sstream> // stringstrem 3#include <algorithm> // copy 4 5int main() 6{ 7 std::stringstream ss; 8 ss << "hello" << "," << "world"; 9 char char_array[256]; 10 const char *s = ss.str().c_str(); 11 std::copy(s, s + ss.str().size() + 1, char_array); 12 std::cout << char_array << std::endl; 13}
char char_array[256]{};
のように 0 で初期化しているのであれば、
copy
の + 1
は不要です。
copy(s, s + ss.str().size() + 1, char_array);
の代わりに、
copy_n(s, ss.str().size() + 1, char_array);
でもかまいません。
追記
stringのc_str()が駄目なのではなく、stringstreamのstr()が返すstringは一時オブジェクトなため式の終わりまでしか寿命が無いのです。
SHOMIさん、ご指摘ありがとうございます。その通りですね。
次のように書けば大丈夫でしょう。
C++
1#include <iostream> // cout, endl 2#include <sstream> // stringstrem 3#include <algorithm> // copy_n 4 5int main() 6{ 7 std::stringstream ss; 8 ss << "hello" << "," << "world"; 9 char char_array[256]{}; 10 std::string s = ss.str(); 11 std::copy_n(s.begin(), s.size(), char_array); 12 std::cout << char_array << std::endl; 13}
最初、char_array が十分なサイズであれば、ss >> char_array;
でも良いかな
と考えたのですが、ss にスペースが挿入されていた場合、>>
では、そこで途切れ
るため、ss.str() を使うことにしました。
Beared-Ockhamさんの回答にあるように
ss.get(char_array, sizeof char_arrya);
でよかったんですね。
勉強になります。
投稿2020/08/13 03:14
編集2020/08/13 05:55総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/13 04:10
2020/08/13 04:21 編集
2020/08/13 04:29
2020/08/13 05:55 編集
2020/08/13 05:57
0
strcpy と言う関数があります
#まあ、stringにできるなら文字配列にできますわな
投稿2020/08/13 02:54
編集2020/08/13 02:56総合スコア88042
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/13 04:11