teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

名前の修正

2020/08/13 05:55

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -22,7 +22,7 @@
22
22
  **追記**
23
23
  > stringのc_str()が駄目なのではなく、stringstreamのstr()が返すstringは一時オブジェクトなため式の終わりまでしか寿命が無いのです。
24
24
 
25
- SHIOMさん、ご指摘ありがとうございます。その通りですね。
25
+ SHOMIさん、ご指摘ありがとうございます。その通りですね。
26
26
  次のように書けば大丈夫でしょう。
27
27
  ```C++
28
28
  #include <iostream> // cout, endl

3

const char * から string

2020/08/13 05:55

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -17,4 +17,32 @@
17
17
  `copy` の `+ 1` は不要です。
18
18
 
19
19
  `copy(s, s + ss.str().size() + 1, char_array);` の代わりに、
20
- `copy_n(s, ss.str().size() + 1, char_array);` でもかまいません。
20
+ `copy_n(s, ss.str().size() + 1, char_array);` でもかまいません。
21
+
22
+ **追記**
23
+ > stringのc_str()が駄目なのではなく、stringstreamのstr()が返すstringは一時オブジェクトなため式の終わりまでしか寿命が無いのです。
24
+
25
+ SHIOMさん、ご指摘ありがとうございます。その通りですね。
26
+ 次のように書けば大丈夫でしょう。
27
+ ```C++
28
+ #include <iostream> // cout, endl
29
+ #include <sstream> // stringstrem
30
+ #include <algorithm> // copy_n
31
+
32
+ int main()
33
+ {
34
+ std::stringstream ss;
35
+ ss << "hello" << "," << "world";
36
+ char char_array[256]{};
37
+ std::string s = ss.str();
38
+ std::copy_n(s.begin(), s.size(), char_array);
39
+ std::cout << char_array << std::endl;
40
+ }
41
+ ```
42
+ 最初、char_array が十分なサイズであれば、`ss >> char_array;` でも良いかな
43
+ と考えたのですが、ss にスペースが挿入されていた場合、`>>` では、そこで途切れ
44
+ るため、ss.str() を使うことにしました。
45
+
46
+ Beared-Ockhamさんの回答にあるように
47
+ `ss.get(char_array, sizeof char_arrya);` でよかったんですね。
48
+ 勉強になります。

2

copy_n の追加

2020/08/13 05:27

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -14,4 +14,7 @@
14
14
  }
15
15
  ```
16
16
  `char char_array[256]{};` のように 0 で初期化しているのであれば、
17
- `copy` の `+ 1` は不要です。
17
+ `copy` の `+ 1` は不要です。
18
+
19
+ `copy(s, s + ss.str().size() + 1, char_array);` の代わりに、
20
+ `copy_n(s, ss.str().size() + 1, char_array);` でもかまいません。

1

説明を追加

2020/08/13 03:30

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -12,4 +12,6 @@
12
12
  std::copy(s, s + ss.str().size() + 1, char_array);
13
13
  std::cout << char_array << std::endl;
14
14
  }
15
- ```
15
+ ```
16
+ `char char_array[256]{};` のように 0 で初期化しているのであれば、
17
+ `copy` の `+ 1` は不要です。