質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

8556閲覧

stringstreamをchar配列へ変換する方法

__ook

総合スコア49

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/08/13 02:50

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

Bearded-Ockham

総合スコア430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

__ook

2020/08/13 04:11

ありがとうございます!メンバ関数があるのですね。勉強になりました。
guest

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
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHOMI

2020/08/13 03:34 編集

>const char *s = ss.str().c_str(); stringstreamのstr()が返すのは一時オブジェクトなので、c_str()でポインタを取って後からアクセスするのは駄目ですよ。
__ook

2020/08/13 04:10

stringのc_str()ももしかしてだめなのでしょうか? std::string s = "hello, world"; const char* p = s.c_str(); std::cout << p << std::endl; のように書くのは…
SHOMI

2020/08/13 04:21 編集

いいえ。pを使用するまでにsが破棄されたり、sの内容が変更されたりしていなければ問題ありません。 stringのc_str()が駄目なのではなく、stringstreamのstr()が返すstringは一時オブジェクトなため式の終わりまでしか寿命が無いのです。
__ook

2020/08/13 04:29

なるほど。stringのc_str()はstring内の文字列ポインタを渡しており、stringstreamのstr()はstringのオブジェクトを返しているのですね。ありがとうございます。
SHOMI

2020/08/13 05:55 編集

kazuma-sさんの追記のように一旦string変数に代入してそちらのc_str()を使用するか、 const参照(const std::string& s = ss.str();)や右辺値参照(std::string&& s = ss.str();)で一時オブジェクトを延命してそちらのc_str()を使用する、もしくは std::copy_n(ss.str().c_str(), ss.str().size() + 1, char_array); と一文で書いた場合は問題ありません。 >SHIOM 細かいですがSHOMIです…
kazuma-s

2020/08/13 05:57

名前を間違えてすみません。修正しました。
guest

0

strcpy と言う関数があります

#まあ、stringにできるなら文字配列にできますわな

投稿2020/08/13 02:54

編集2020/08/13 02:56
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

__ook

2020/08/13 02:56

strcpy(char_array, ss.str().c_str()); のようにするのがベストでしょうか。 C++の関数にはないということでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問